diff -r de56132c008d -r bdac73ed481e includes/functions.php --- a/includes/functions.php Sun Mar 28 21:49:26 2010 -0400 +++ b/includes/functions.php Sun Mar 28 23:10:46 2010 -0400 @@ -20,15 +20,15 @@ function getConfig($n, $default = false) { - global $enano_config; - if ( isset( $enano_config[ $n ] ) ) - { - return $enano_config[$n]; - } - else - { - return $default; - } + global $enano_config; + if ( isset( $enano_config[ $n ] ) ) + { + return $enano_config[$n]; + } + else + { + return $default; + } } /** @@ -40,37 +40,37 @@ function setConfig($n, $v) { - global $enano_config, $db; - - if ( isset($enano_config[$n]) ) - { - if ( $enano_config[$n] === $v ) - { - // configuration already matches this value - return true; - } - } - - $enano_config[$n] = $v; - if ( $v === false ) - unset($enano_config[$n]); - - $v = $db->escape($v); - - $e = $db->sql_query('DELETE FROM '.table_prefix.'config WHERE config_name=\''.$n.'\';'); - if ( !$e ) - { - $db->_die('Error during generic setConfig() call row deletion.'); - } - - if ( $v !== false ) - { - $e = $db->sql_query('INSERT INTO '.table_prefix.'config(config_name, config_value) VALUES(\''.$n.'\', \''.$v.'\')'); - if ( !$e ) - { - $db->_die('Error during generic setConfig() call row insertion.'); - } - } + global $enano_config, $db; + + if ( isset($enano_config[$n]) ) + { + if ( $enano_config[$n] === $v ) + { + // configuration already matches this value + return true; + } + } + + $enano_config[$n] = $v; + if ( $v === false ) + unset($enano_config[$n]); + + $v = $db->escape($v); + + $e = $db->sql_query('DELETE FROM '.table_prefix.'config WHERE config_name=\''.$n.'\';'); + if ( !$e ) + { + $db->_die('Error during generic setConfig() call row deletion.'); + } + + if ( $v !== false ) + { + $e = $db->sql_query('INSERT INTO '.table_prefix.'config(config_name, config_value) VALUES(\''.$n.'\', \''.$v.'\')'); + if ( !$e ) + { + $db->_die('Error during generic setConfig() call row insertion.'); + } + } } /** @@ -83,42 +83,42 @@ if ( !function_exists('makeUrl') ) { - function makeUrl($t, $query = false, $escape = false) - { - global $db, $session, $paths, $template, $plugins; // Common objects - $flags = ''; - $sep = urlSeparator; - $t = sanitize_page_id($t); - if ( isset($_GET['printable'] ) ) - { - $flags .= $sep . 'printable=yes'; - $sep = '&'; - } - if ( isset($_GET['theme'] ) ) - { - $flags .= $sep . 'theme='.$session->theme; - $sep = '&'; - } - if ( isset($_GET['style'] ) ) - { - $flags .= $sep . 'style='.$session->style; - $sep = '&'; - } - if ( isset($_GET['lang']) && preg_match('/^[a-z0-9_]+$/', @$_GET['lang']) ) - { - $flags .= $sep . 'lang=' . urlencode($_GET['lang']); - $sep = '&'; - } - - $url = is_object($session) ? $session->append_sid(contentPath.$t.$flags) : contentPath . $t . $flags; - if($query) - { - $sep = strstr($url, '?') ? '&' : '?'; - $url = $url . $sep . $query; - } - - return ($escape) ? htmlspecialchars($url) : $url; - } + function makeUrl($t, $query = false, $escape = false) + { + global $db, $session, $paths, $template, $plugins; // Common objects + $flags = ''; + $sep = urlSeparator; + $t = sanitize_page_id($t); + if ( isset($_GET['printable'] ) ) + { + $flags .= $sep . 'printable=yes'; + $sep = '&'; + } + if ( isset($_GET['theme'] ) ) + { + $flags .= $sep . 'theme='.$session->theme; + $sep = '&'; + } + if ( isset($_GET['style'] ) ) + { + $flags .= $sep . 'style='.$session->style; + $sep = '&'; + } + if ( isset($_GET['lang']) && preg_match('/^[a-z0-9_]+$/', @$_GET['lang']) ) + { + $flags .= $sep . 'lang=' . urlencode($_GET['lang']); + $sep = '&'; + } + + $url = is_object($session) ? $session->append_sid(contentPath.$t.$flags) : contentPath . $t . $flags; + if($query) + { + $sep = strstr($url, '?') ? '&' : '?'; + $url = $url . $sep . $query; + } + + return ($escape) ? htmlspecialchars($url) : $url; + } } /** @@ -132,72 +132,72 @@ if ( !function_exists('makeUrlNS') ) { - function makeUrlNS($n, $t, $query = false, $escape = false) - { - global $db, $session, $paths, $template, $plugins; // Common objects - $flags = ''; - - if(defined('ENANO_BASE_CLASSES_INITIALIZED')) - { - $sep = urlSeparator; - } - else - { - $sep = (strstr($_SERVER['REQUEST_URI'], '?')) ? '&' : '?'; - } - if ( isset( $_GET['printable'] ) ) { - $flags .= $sep . 'printable'; - $sep = '&'; - } - if ( isset( $_GET['theme'] ) ) - { - $flags .= $sep . 'theme='.$session->theme; - $sep = '&'; - } - if ( isset( $_GET['style'] ) ) - { - $flags .= $sep . 'style='.$session->style; - $sep = '&'; - } - if ( isset($_GET['lang']) && preg_match('/^[a-z0-9_]+$/', @$_GET['lang']) ) - { - $flags .= $sep . 'lang=' . urlencode($_GET['lang']); - $sep = '&'; - } - - $ns_prefix = "$n:"; - - if(defined('ENANO_BASE_CLASSES_INITIALIZED')) - { - $ns_prefix = ( isset($paths->nslist[$n]) ) ? $paths->nslist[$n] : $n . substr($paths->nslist['Special'], -1); - $url = contentPath . $ns_prefix . $t . $flags; - } - else - { - // If the path manager hasn't been initted yet, take an educated guess at what the URI should be - $url = contentPath . $n . ':' . $t . $flags; - } - - if($query) - { - if(strstr($url, '?')) - { - $sep = '&'; - } - else - { - $sep = '?'; - } - $url = $url . $sep . $query . $flags; - } - - if(defined('ENANO_BASE_CLASSES_INITIALIZED')) - { - $url = $session->append_sid($url); - } - - return ($escape) ? htmlspecialchars($url) : $url; - } + function makeUrlNS($n, $t, $query = false, $escape = false) + { + global $db, $session, $paths, $template, $plugins; // Common objects + $flags = ''; + + if(defined('ENANO_BASE_CLASSES_INITIALIZED')) + { + $sep = urlSeparator; + } + else + { + $sep = (strstr($_SERVER['REQUEST_URI'], '?')) ? '&' : '?'; + } + if ( isset( $_GET['printable'] ) ) { + $flags .= $sep . 'printable'; + $sep = '&'; + } + if ( isset( $_GET['theme'] ) ) + { + $flags .= $sep . 'theme='.$session->theme; + $sep = '&'; + } + if ( isset( $_GET['style'] ) ) + { + $flags .= $sep . 'style='.$session->style; + $sep = '&'; + } + if ( isset($_GET['lang']) && preg_match('/^[a-z0-9_]+$/', @$_GET['lang']) ) + { + $flags .= $sep . 'lang=' . urlencode($_GET['lang']); + $sep = '&'; + } + + $ns_prefix = "$n:"; + + if(defined('ENANO_BASE_CLASSES_INITIALIZED')) + { + $ns_prefix = ( isset($paths->nslist[$n]) ) ? $paths->nslist[$n] : $n . substr($paths->nslist['Special'], -1); + $url = contentPath . $ns_prefix . $t . $flags; + } + else + { + // If the path manager hasn't been initted yet, take an educated guess at what the URI should be + $url = contentPath . $n . ':' . $t . $flags; + } + + if($query) + { + if(strstr($url, '?')) + { + $sep = '&'; + } + else + { + $sep = '?'; + } + $url = $url . $sep . $query . $flags; + } + + if(defined('ENANO_BASE_CLASSES_INITIALIZED')) + { + $url = $session->append_sid($url); + } + + return ($escape) ? htmlspecialchars($url) : $url; + } } /** @@ -211,7 +211,7 @@ function makeUrlComplete($n, $t, $query = false, $escape = false) { - return get_server_url() . makeUrlNS($n, $t, $query, $escape); + return get_server_url() . makeUrlNS($n, $t, $query, $escape); } /** @@ -221,15 +221,15 @@ function get_server_url() { - $server_name = false; - if ( isset($_SERVER['HTTP_HOST']) ) - $server_name = $_SERVER['HTTP_HOST']; - else if ( isset($_SERVER['SERVER_NAME']) ) - $server_name = $_SERVER['SERVER_NAME']; - else - $server_name = 'localhost'; - - return 'http' . ( $GLOBALS['is_https'] ) . '://' . $server_name; + $server_name = false; + if ( isset($_SERVER['HTTP_HOST']) ) + $server_name = $_SERVER['HTTP_HOST']; + else if ( isset($_SERVER['SERVER_NAME']) ) + $server_name = $_SERVER['SERVER_NAME']; + else + $server_name = 'localhost'; + + return 'http' . ( $GLOBALS['is_https'] ) . '://' . $server_name; } /** @@ -239,18 +239,18 @@ function get_main_page($force_logged_in = false) { - global $db, $session, $paths, $template, $plugins; // Common objects - - $logged_in = false; - if ( is_object($session) && !$force_logged_in ) - { - $logged_in = $session->user_logged_in; - } - else if ( $force_logged_in ) - { - $logged_in = true; - } - return $logged_in && getConfig('main_page_alt_enable', '0') == '1' ? getConfig('main_page_alt', getConfig('main_page', 'Main_Page')) : getConfig('main_page', 'Main_Page'); + global $db, $session, $paths, $template, $plugins; // Common objects + + $logged_in = false; + if ( is_object($session) && !$force_logged_in ) + { + $logged_in = $session->user_logged_in; + } + else if ( $force_logged_in ) + { + $logged_in = true; + } + return $logged_in && getConfig('main_page_alt_enable', '0') == '1' ? getConfig('main_page_alt', getConfig('main_page', 'Main_Page')) : getConfig('main_page', 'Main_Page'); } /** @@ -262,44 +262,44 @@ function get_title($sanitize = true, $chop_special = false) { - $title = ''; - if ( isset($_GET['title']) ) - { - $title = $_GET['title']; - } - else if ( isset($_SERVER['PATH_INFO']) ) - { - // fix for apache + CGI (occurred on a GoDaddy server, thanks mm3) - if ( @substr(@$_SERVER['GATEWAY_INTERFACE'], 0, 3) === 'CGI' && $_SERVER['PATH_INFO'] == scriptPath . '/index.php' ) - { - // do nothing; ignore PATH_INFO - } - else - { - $title = substr($_SERVER['PATH_INFO'], ( strpos($_SERVER['PATH_INFO'], '/') ) + 1 ); - } - } - else - { - // This method really isn't supported because apache has a habit of passing dots as underscores, thus corrupting the request - // If you really want to try it, the URI format is yoursite.com/?/Page_title - if ( !empty($_SERVER['QUERY_STRING']) && substr($_SERVER['QUERY_STRING'], 0, 1) == '/' ) - { - $pos = ( ($_ = strpos($_SERVER['QUERY_STRING'], '&')) !== false ) ? $_ - 1: 0x7FFFFFFF; - $title = substr($_SERVER['QUERY_STRING'], 1, $pos); - } - } - - if ( $chop_special ) - { - list(, $ns) = RenderMan::strToPageID($title); - if ( $ns == 'Special' || $ns == 'Admin' ) - { - list($title) = explode('/', $title); - } - } - - return ( $sanitize ) ? sanitize_page_id($title) : $title; + $title = ''; + if ( isset($_GET['title']) ) + { + $title = $_GET['title']; + } + else if ( isset($_SERVER['PATH_INFO']) ) + { + // fix for apache + CGI (occurred on a GoDaddy server, thanks mm3) + if ( @substr(@$_SERVER['GATEWAY_INTERFACE'], 0, 3) === 'CGI' && $_SERVER['PATH_INFO'] == scriptPath . '/index.php' ) + { + // do nothing; ignore PATH_INFO + } + else + { + $title = substr($_SERVER['PATH_INFO'], ( strpos($_SERVER['PATH_INFO'], '/') ) + 1 ); + } + } + else + { + // This method really isn't supported because apache has a habit of passing dots as underscores, thus corrupting the request + // If you really want to try it, the URI format is yoursite.com/?/Page_title + if ( !empty($_SERVER['QUERY_STRING']) && substr($_SERVER['QUERY_STRING'], 0, 1) == '/' ) + { + $pos = ( ($_ = strpos($_SERVER['QUERY_STRING'], '&')) !== false ) ? $_ - 1: 0x7FFFFFFF; + $title = substr($_SERVER['QUERY_STRING'], 1, $pos); + } + } + + if ( $chop_special ) + { + list(, $ns) = RenderMan::strToPageID($title); + if ( $ns == 'Special' || $ns == 'Admin' ) + { + list($title) = explode('/', $title); + } + } + + return ( $sanitize ) ? sanitize_page_id($title) : $title; } /** @@ -309,7 +309,7 @@ function have_blank_urlname_page() { - return getConfig('main_page', 'Main_Page') == '' || getConfig('main_page', getConfig('main_page', 'Main_Page')) == ''; + return getConfig('main_page', 'Main_Page') == '' || getConfig('main_page', getConfig('main_page', 'Main_Page')) == ''; } /** @@ -321,78 +321,78 @@ function enano_date($string, $timestamp = false) { - if ( !is_int($timestamp) && !is_double($timestamp) && strval(intval($timestamp)) !== $timestamp ) - $timestamp = time(); - - if ( is_int($string) ) - { - global $session, $lang; - $date_fmt = is_object($session) ? $session->date_format : DATE_4; - $time_fmt = is_object($session) ? $session->time_format : TIME_24_NS; - - // within a week? use a relative date - if ( $timestamp + ( 86400 * 7 ) >= time() && $string & ED_DATE && is_object($lang) && is_object($session) && !($string & ED_DATE_FULL) ) - { - $relative_date = get_relative_date($timestamp); - if ( $string === ED_DATE ) - // why do more work if we're done? - return $relative_date; - } - - $flags = $string; - $string = array(); - if ( $flags & ED_DATE && !isset($relative_date) ) - $string[] = $date_fmt; - if ( $flags & ED_TIME ) - $string[] = $time_fmt; - - $string = implode(' ', $string); - } - - // perform timestamp offset - global $timezone; - // it's gonna be in minutes, so multiply by 60 to offset the unix timestamp - $timestamp = $timestamp + ( $timezone * 60 ); - - // are we in DST? - global $dst_params; - $dst_offset = 0; - if ( check_timestamp_dst($timestamp, $dst_params[0], $dst_params[1], $dst_params[2], $dst_params[3]) ) - { - // offset for DST - $timestamp += ( $dst_params[4] * 60 ); - $dst_offset = $dst_params[4]; - } - - // Does this date string include a timezone? If so, gmdate() will report UTC, which is wrong - // FIXME This is kind of a halfass replacement... - foreach ( array('e', 'T', 'O', 'P') as $char ) - { - if ( ($pos = strpos($string, $char)) !== false ) - { - if ( $string{ $pos - 1 } != '\\' ) - { - // add in our own timezone string - // FIXME: l10n? (do we need to? does anyone really not know what "GMT" means? even uglier escaping?) - $tzi = '\\G\\M\\T'; - $tzo = $timezone + $dst_offset; - $sign = $tzo > 0 ? '+' : '-'; - $tzi .= $sign . (intval(abs($tzo / 60))); - if ( $tzo % 60 ) - $tzi .= sprintf(":%02d", abs($tzo) % 60); - - $string = substr($string, 0, $pos) . $tzi . substr($string, $pos + 1); - } - } - } - - // Let PHP do the work for us =) - $result = gmdate($string, $timestamp); - if ( isset($relative_date) ) - { - $result = "$relative_date, $result"; - } - return $result; + if ( !is_int($timestamp) && !is_double($timestamp) && strval(intval($timestamp)) !== $timestamp ) + $timestamp = time(); + + if ( is_int($string) ) + { + global $session, $lang; + $date_fmt = is_object($session) ? $session->date_format : DATE_4; + $time_fmt = is_object($session) ? $session->time_format : TIME_24_NS; + + // within a week? use a relative date + if ( $timestamp + ( 86400 * 7 ) >= time() && $string & ED_DATE && is_object($lang) && is_object($session) && !($string & ED_DATE_FULL) ) + { + $relative_date = get_relative_date($timestamp); + if ( $string === ED_DATE ) + // why do more work if we're done? + return $relative_date; + } + + $flags = $string; + $string = array(); + if ( $flags & ED_DATE && !isset($relative_date) ) + $string[] = $date_fmt; + if ( $flags & ED_TIME ) + $string[] = $time_fmt; + + $string = implode(' ', $string); + } + + // perform timestamp offset + global $timezone; + // it's gonna be in minutes, so multiply by 60 to offset the unix timestamp + $timestamp = $timestamp + ( $timezone * 60 ); + + // are we in DST? + global $dst_params; + $dst_offset = 0; + if ( check_timestamp_dst($timestamp, $dst_params[0], $dst_params[1], $dst_params[2], $dst_params[3]) ) + { + // offset for DST + $timestamp += ( $dst_params[4] * 60 ); + $dst_offset = $dst_params[4]; + } + + // Does this date string include a timezone? If so, gmdate() will report UTC, which is wrong + // FIXME This is kind of a halfass replacement... + foreach ( array('e', 'T', 'O', 'P') as $char ) + { + if ( ($pos = strpos($string, $char)) !== false ) + { + if ( $string{ $pos - 1 } != '\\' ) + { + // add in our own timezone string + // FIXME: l10n? (do we need to? does anyone really not know what "GMT" means? even uglier escaping?) + $tzi = '\\G\\M\\T'; + $tzo = $timezone + $dst_offset; + $sign = $tzo > 0 ? '+' : '-'; + $tzi .= $sign . (intval(abs($tzo / 60))); + if ( $tzo % 60 ) + $tzi .= sprintf(":%02d", abs($tzo) % 60); + + $string = substr($string, 0, $pos) . $tzi . substr($string, $pos + 1); + } + } + } + + // Let PHP do the work for us =) + $result = gmdate($string, $timestamp); + if ( isset($relative_date) ) + { + $result = "$relative_date, $result"; + } + return $result; } /** @@ -403,47 +403,47 @@ function get_relative_date($time) { - global $lang, $session; - // Our formatting string to pass to enano_date() - // This should not include minute/second info, only today's date in whatever format suits your fancy - $formatstring = $session->date_format; - // Today's date - $today = enano_date($formatstring); - // Yesterday's date - $yesterday = enano_date($formatstring, (time() - (24*60*60))); - // Date on the input - $then = enano_date($formatstring, $time); - // "X days ago" logic - for ( $i = 2; $i <= 6; $i++ ) - { - // hours_in_day * minutes_in_hour * seconds_in_minute * num_days - $offset = 24 * 60 * 60 * $i; - $days_ago = enano_date($formatstring, (time() - $offset)); - // so does the input timestamp match the date from $i days ago? - if ( $then == $days_ago ) - { - // yes, return $i - return $lang->get('userfuncs_ml_date_daysago', array('days_ago' => $i)); - } - } - // either yesterday, today, or before 6 days ago - switch($then) - { - case $today: - return $lang->get('userfuncs_ml_date_today'); - case $yesterday: - return $lang->get('userfuncs_ml_date_yesterday'); - default: - return $then; - } - // .--. - // |o_o | - // |!_/ | - // // \ \ - // (| | ) - // /'\_ _/`\ - // \___)=(___/ - return 'Linux rocks!'; + global $lang, $session; + // Our formatting string to pass to enano_date() + // This should not include minute/second info, only today's date in whatever format suits your fancy + $formatstring = $session->date_format; + // Today's date + $today = enano_date($formatstring); + // Yesterday's date + $yesterday = enano_date($formatstring, (time() - (24*60*60))); + // Date on the input + $then = enano_date($formatstring, $time); + // "X days ago" logic + for ( $i = 2; $i <= 6; $i++ ) + { + // hours_in_day * minutes_in_hour * seconds_in_minute * num_days + $offset = 24 * 60 * 60 * $i; + $days_ago = enano_date($formatstring, (time() - $offset)); + // so does the input timestamp match the date from $i days ago? + if ( $then == $days_ago ) + { + // yes, return $i + return $lang->get('userfuncs_ml_date_daysago', array('days_ago' => $i)); + } + } + // either yesterday, today, or before 6 days ago + switch($then) + { + case $today: + return $lang->get('userfuncs_ml_date_today'); + case $yesterday: + return $lang->get('userfuncs_ml_date_yesterday'); + default: + return $then; + } + // .--. + // |o_o | + // |!_/ | + // // \ \ + // (| | ) + // /'\_ _/`\ + // \___)=(___/ + return 'Linux rocks!'; } /** @@ -458,31 +458,31 @@ function check_timestamp_dst($time, $start_month, $start_sunday, $end_month, $end_sunday) { - static $sundays = array(FIRST_SUNDAY, SECOND_SUNDAY, THIRD_SUNDAY, LAST_SUNDAY); - - // perform timestamp offset - global $timezone; - // it's gonna be in minutes, so multiply by 60 to offset the unix timestamp - $time = $time + ( $timezone * 60 ); - $year = intval(gmdate('Y', $time)); - - // one-pass validation - if ( !in_array($start_sunday, $sundays) || !in_array($end_sunday, $sundays) || - $start_month < 1 || $start_month > 12 || $end_month < 1 || $end_month > 12 ) - return false; - - // get timestamp of the selected sunday (start) - $dst_start = get_sunday_timestamp($start_month, $start_sunday, $year); - $dst_end = get_sunday_timestamp($end_month, $end_sunday, $year); - - if ( $dst_start > $dst_end ) - { - // start time is past the end time, this means we're in the southern hemisphere - // as a result, if we're within the range, DST is NOT in progress. - return !( $time >= $dst_start && $time <= $dst_end ); - } - - return $time >= $dst_start && $time <= $dst_end; + static $sundays = array(FIRST_SUNDAY, SECOND_SUNDAY, THIRD_SUNDAY, LAST_SUNDAY); + + // perform timestamp offset + global $timezone; + // it's gonna be in minutes, so multiply by 60 to offset the unix timestamp + $time = $time + ( $timezone * 60 ); + $year = intval(gmdate('Y', $time)); + + // one-pass validation + if ( !in_array($start_sunday, $sundays) || !in_array($end_sunday, $sundays) || + $start_month < 1 || $start_month > 12 || $end_month < 1 || $end_month > 12 ) + return false; + + // get timestamp of the selected sunday (start) + $dst_start = get_sunday_timestamp($start_month, $start_sunday, $year); + $dst_end = get_sunday_timestamp($end_month, $end_sunday, $year); + + if ( $dst_start > $dst_end ) + { + // start time is past the end time, this means we're in the southern hemisphere + // as a result, if we're within the range, DST is NOT in progress. + return !( $time >= $dst_start && $time <= $dst_end ); + } + + return $time >= $dst_start && $time <= $dst_end; } /** @@ -495,48 +495,48 @@ function get_sunday_timestamp($month, $sunday, $year) { - $days_in_month = array( - 1 => 31, - 2 => $year % 4 == 0 && ( $year % 100 != 0 || ( $year % 100 == 0 && $year % 400 == 0 ) ) ? 29 : 28, - 3 => 31, - 4 => 30, - 5 => 31, - 6 => 30, - 7 => 31, - 8 => 31, - 9 => 30, - 10 => 31, - 11 => 30, - 12 => 31 - ); - - $result = mktime(0, 0, 0, $month, 1, $year); - - // hack. allows a specific day of the month to be set instead of a sunday. not a good place to do this. - if ( is_string($sunday) && substr($sunday, -1) === 'd' ) - { - $result += 86400 * ( intval($sunday) - 1); - return $result; - } - - $tick = 0; - $days_remaining = $days_in_month[$month]; - while ( true ) - { - if ( date('D', $result) == 'Sun' ) - { - $tick++; - if ( ( $tick == 1 && $sunday == FIRST_SUNDAY ) || - ( $tick == 2 && $sunday == SECOND_SUNDAY ) || - ( $tick == 3 && $sunday == THIRD_SUNDAY ) || - ( $sunday == LAST_SUNDAY && $days_remaining < 7 ) ) - break; - } - $days_remaining--; - $result += 86400; - } - - return $result; + $days_in_month = array( + 1 => 31, + 2 => $year % 4 == 0 && ( $year % 100 != 0 || ( $year % 100 == 0 && $year % 400 == 0 ) ) ? 29 : 28, + 3 => 31, + 4 => 30, + 5 => 31, + 6 => 30, + 7 => 31, + 8 => 31, + 9 => 30, + 10 => 31, + 11 => 30, + 12 => 31 + ); + + $result = mktime(0, 0, 0, $month, 1, $year); + + // hack. allows a specific day of the month to be set instead of a sunday. not a good place to do this. + if ( is_string($sunday) && substr($sunday, -1) === 'd' ) + { + $result += 86400 * ( intval($sunday) - 1); + return $result; + } + + $tick = 0; + $days_remaining = $days_in_month[$month]; + while ( true ) + { + if ( date('D', $result) == 'Sun' ) + { + $tick++; + if ( ( $tick == 1 && $sunday == FIRST_SUNDAY ) || + ( $tick == 2 && $sunday == SECOND_SUNDAY ) || + ( $tick == 3 && $sunday == THIRD_SUNDAY ) || + ( $sunday == LAST_SUNDAY && $days_remaining < 7 ) ) + break; + } + $days_remaining--; + $result += 86400; + } + + return $result; } /** @@ -548,10 +548,10 @@ function get_page_title($page_id, $show_ns = true) { - global $db, $session, $paths, $template, $plugins; // Common objects - - $idata = RenderMan::strToPageID($page_id); - return get_page_title_ns($idata[0], $idata[1]); + global $db, $session, $paths, $template, $plugins; // Common objects + + $idata = RenderMan::strToPageID($page_id); + return get_page_title_ns($idata[0], $idata[1]); } /** @@ -563,10 +563,10 @@ function get_page_title_ns($page_id, $namespace) { - global $db, $session, $paths, $template, $plugins; // Common objects - - $ns = namespace_factory($page_id, $namespace); - return $ns->title; + global $db, $session, $paths, $template, $plugins; // Common objects + + $ns = namespace_factory($page_id, $namespace); + return $ns->title; } /** @@ -579,59 +579,59 @@ function redirect($url, $title = 'etc_redirect_title', $message = 'etc_redirect_body', $timeout = 3) { - global $db, $session, $paths, $template, $plugins; // Common objects - global $lang; - - // POST check added in 1.1.x because Firefox 3.0 asks us if we want to "resend the form - // data to the new location", which can be confusing for some users. - $is_firefox_3 = ( strstr(@$_SERVER['HTTP_USER_AGENT'], 'Firefox/3.') ) ? true : false; - if ( $timeout == 0 && ( empty($_POST) || !$is_firefox_3 ) ) - { - header('Location: ' . $url); - header('Content-length: 0'); - header('HTTP/1.1 307 Temporary Redirect'); - - // with 3xx codes HTTP clients expect a response of 0 bytes, so just die here - exit(); - } - - if ( !is_object($template) ) - { - $template = new template_nodb(); - $template->load_theme('oxygen', 'bleu', false); - $template->assign_vars(array( - 'SITE_NAME' => 'Enano', - 'SITE_DESC' => 'This site is experiencing a critical error and cannot load.', - 'COPYRIGHT' => 'Powered by Enano CMS - © 2006-2008 Dan Fuhry. This program is Free Software; see the GPL file included with this package for details.', - 'PAGE_NAME' => htmlspecialchars($title) - )); - } - - $template->add_header(''); - $template->add_header(' - '); - - if ( get_class($template) == 'template_nodb' ) - $template->init_vars(); - - $template->assign_vars(array('PAGE_NAME' => $title)); - $template->header(true); - echo '

' . $message . '

'; - $subst = array( - 'timeout' => $timeout, - 'redirect_url' => str_replace('"', '\\"', $url) - ); - echo '

' . $lang->get('etc_redirect_timeout', $subst) . '

'; - $template->footer(true); - - $db->close(); - exit(0); + global $db, $session, $paths, $template, $plugins; // Common objects + global $lang; + + // POST check added in 1.1.x because Firefox 3.0 asks us if we want to "resend the form + // data to the new location", which can be confusing for some users. + $is_firefox_3 = ( strstr(@$_SERVER['HTTP_USER_AGENT'], 'Firefox/3.') ) ? true : false; + if ( $timeout == 0 && ( empty($_POST) || !$is_firefox_3 ) ) + { + header('Location: ' . $url); + header('Content-length: 0'); + header('HTTP/1.1 307 Temporary Redirect'); + + // with 3xx codes HTTP clients expect a response of 0 bytes, so just die here + exit(); + } + + if ( !is_object($template) ) + { + $template = new template_nodb(); + $template->load_theme('oxygen', 'bleu', false); + $template->assign_vars(array( + 'SITE_NAME' => 'Enano', + 'SITE_DESC' => 'This site is experiencing a critical error and cannot load.', + 'COPYRIGHT' => 'Powered by Enano CMS - © 2006-2008 Dan Fuhry. This program is Free Software; see the GPL file included with this package for details.', + 'PAGE_NAME' => htmlspecialchars($title) + )); + } + + $template->add_header(''); + $template->add_header(' + '); + + if ( get_class($template) == 'template_nodb' ) + $template->init_vars(); + + $template->assign_vars(array('PAGE_NAME' => $title)); + $template->header(true); + echo '

' . $message . '

'; + $subst = array( + 'timeout' => $timeout, + 'redirect_url' => str_replace('"', '\\"', $url) + ); + echo '

' . $lang->get('etc_redirect_timeout', $subst) . '

'; + $template->footer(true); + + $db->close(); + exit(0); } @@ -641,85 +641,85 @@ function csrf_request_confirm() { - global $db, $session, $paths, $template, $plugins; // Common objects - global $lang, $output; - - // If the token was overridden with the correct one, the user confirmed the action using this form. Continue exec. - if ( isset($_POST['cstok']) || isset($_GET['cstok']) ) - { - // using the if() check makes sure that the token isn't in a cookie, since $_REQUEST includes $_COOKIE. - $token_check =& $_REQUEST['cstok']; - if ( $token_check === $session->csrf_token ) - { - // overridden token matches, continue exec - return true; - } - } - - @ob_end_clean(); - - $output->set_title($lang->get('user_csrf_confirm_title')); - $output->header(); - - // initial info - echo '

' . $lang->get('user_csrf_confirm_body') . '

'; - - // start form - $form_method = ( empty($_POST) ) ? 'get' : 'post'; - echo '
'; - - echo '
'; - echo '' . $lang->get('user_csrf_confirm_btn_viewrequest') . '
'; - - if ( empty($_POST) ) - { - // GET request - echo csrf_confirm_get_recursive(); - } - else - { - // POST request - echo csrf_confirm_post_recursive(); - } - echo '
'; - // insert the right CSRF token - echo ''; - echo '

'; - echo '
'; - - $output->footer(); - - exit; + global $db, $session, $paths, $template, $plugins; // Common objects + global $lang, $output; + + // If the token was overridden with the correct one, the user confirmed the action using this form. Continue exec. + if ( isset($_POST['cstok']) || isset($_GET['cstok']) ) + { + // using the if() check makes sure that the token isn't in a cookie, since $_REQUEST includes $_COOKIE. + $token_check =& $_REQUEST['cstok']; + if ( $token_check === $session->csrf_token ) + { + // overridden token matches, continue exec + return true; + } + } + + @ob_end_clean(); + + $output->set_title($lang->get('user_csrf_confirm_title')); + $output->header(); + + // initial info + echo '

' . $lang->get('user_csrf_confirm_body') . '

'; + + // start form + $form_method = ( empty($_POST) ) ? 'get' : 'post'; + echo '
'; + + echo '
'; + echo '' . $lang->get('user_csrf_confirm_btn_viewrequest') . '
'; + + if ( empty($_POST) ) + { + // GET request + echo csrf_confirm_get_recursive(); + } + else + { + // POST request + echo csrf_confirm_post_recursive(); + } + echo '
'; + // insert the right CSRF token + echo ''; + echo '

'; + echo '
'; + + $output->footer(); + + exit; } function csrf_confirm_get_recursive($_inner = false, $pfx = false, $data = false) { - // make posted arrays work right - if ( !$data ) - ( $_inner == 'post' ) ? $data =& $_POST : $data =& $_GET; - foreach ( $data as $key => $value ) - { - $pfx_this = ( empty($pfx) ) ? $key : "{$pfx}[{$key}]"; - if ( is_array($value) ) - { - csrf_confirm_get_recursive(true, $pfx_this, $value); - } - else if ( empty($value) ) - { - echo htmlspecialchars($pfx_this . " = ") . "
\n"; - echo ''; - } - else - { - echo htmlspecialchars($pfx_this . " = " . $value) . "
\n"; - echo ''; - } - } + // make posted arrays work right + if ( !$data ) + ( $_inner == 'post' ) ? $data =& $_POST : $data =& $_GET; + foreach ( $data as $key => $value ) + { + $pfx_this = ( empty($pfx) ) ? $key : "{$pfx}[{$key}]"; + if ( is_array($value) ) + { + csrf_confirm_get_recursive(true, $pfx_this, $value); + } + else if ( empty($value) ) + { + echo htmlspecialchars($pfx_this . " = ") . "
\n"; + echo ''; + } + else + { + echo htmlspecialchars($pfx_this . " = " . $value) . "
\n"; + echo ''; + } + } } function csrf_confirm_post_recursive() { - csrf_confirm_get_recursive('post'); + csrf_confirm_get_recursive('post'); } // Removed wikiFormat() from here, replaced with RenderMan::render @@ -732,22 +732,22 @@ function isPage($p) { - global $db, $session, $paths, $template, $plugins; // Common objects - static $ispage_cache = array(); - if ( isset($ispage_cache[$p]) ) - return $ispage_cache[$p]; - - list($page_id, $namespace) = RenderMan::strToPageID($p); - $cdata = $paths->get_cdata($page_id, $namespace); - if ( !isset($cdata['page_exists']) ) - { - $class = ( class_exists($_ = "Namespace_$namespace") ) ? $_ : "Namespace_Default"; - $page = new $class($page_id, $namespace); - return $page->exists(); - } - - $ispage_cache[$p] = $cdata['page_exists']; - return $cdata['page_exists']; + global $db, $session, $paths, $template, $plugins; // Common objects + static $ispage_cache = array(); + if ( isset($ispage_cache[$p]) ) + return $ispage_cache[$p]; + + list($page_id, $namespace) = RenderMan::strToPageID($p); + $cdata = $paths->get_cdata($page_id, $namespace); + if ( !isset($cdata['page_exists']) ) + { + $class = ( class_exists($_ = "Namespace_$namespace") ) ? $_ : "Namespace_Default"; + $page = new $class($page_id, $namespace); + return $page->exists(); + } + + $ispage_cache[$p] = $cdata['page_exists']; + return $cdata['page_exists']; } /** @@ -759,33 +759,33 @@ function namespace_factory($page_id, $namespace, $revision_id = 0) { - global $db, $session, $paths, $template, $plugins; // Common objects - - static $objcache = array(); - $pathskey = $paths->get_pathskey($page_id, $namespace) . ":$revision_id"; - if ( isset($objcache[$pathskey]) ) - return $objcache[$pathskey]; - - if ( !class_exists("Namespace_$namespace") ) - { - if ( file_exists(ENANO_ROOT . "/includes/namespaces/" . strtolower($namespace) . ".php") ) - { - require(ENANO_ROOT . "/includes/namespaces/" . strtolower($namespace) . ".php"); - } - } - if ( class_exists("Namespace_$namespace") ) - { - $class = "Namespace_$namespace"; - $ns = new $class($page_id, $namespace, $revision_id); - $objcache[$pathskey] = $ns; - return $ns; - } - else - { - $ns = new Namespace_Default($page_id, $namespace, $revision_id); - $objcache[$pathskey] = $ns; - return $ns; - } + global $db, $session, $paths, $template, $plugins; // Common objects + + static $objcache = array(); + $pathskey = $paths->get_pathskey($page_id, $namespace) . ":$revision_id"; + if ( isset($objcache[$pathskey]) ) + return $objcache[$pathskey]; + + if ( !class_exists("Namespace_$namespace") ) + { + if ( file_exists(ENANO_ROOT . "/includes/namespaces/" . strtolower($namespace) . ".php") ) + { + require(ENANO_ROOT . "/includes/namespaces/" . strtolower($namespace) . ".php"); + } + } + if ( class_exists("Namespace_$namespace") ) + { + $class = "Namespace_$namespace"; + $ns = new $class($page_id, $namespace, $revision_id); + $objcache[$pathskey] = $ns; + return $ns; + } + else + { + $ns = new Namespace_Default($page_id, $namespace, $revision_id); + $objcache[$pathskey] = $ns; + return $ns; + } } /** @@ -793,52 +793,52 @@ */ function arrayItemUp($arr, $keyname) { - $keylist = array_keys($arr); - $keyflop = array_flip($keylist); - $idx = $keyflop[$keyname]; - $idxm = $idx - 1; - $temp = $arr[$keylist[$idxm]]; - if($arr[$keylist[0]] == $arr[$keyname]) return $arr; - $arr[$keylist[$idxm]] = $arr[$keylist[$idx]]; - $arr[$keylist[$idx]] = $temp; - return $arr; + $keylist = array_keys($arr); + $keyflop = array_flip($keylist); + $idx = $keyflop[$keyname]; + $idxm = $idx - 1; + $temp = $arr[$keylist[$idxm]]; + if($arr[$keylist[0]] == $arr[$keyname]) return $arr; + $arr[$keylist[$idxm]] = $arr[$keylist[$idx]]; + $arr[$keylist[$idx]] = $temp; + return $arr; } function arrayItemDown($arr, $keyname) { - $keylist = array_keys($arr); - $keyflop = array_flip($keylist); - $idx = $keyflop[$keyname]; - $idxm = $idx + 1; - $temp = $arr[$keylist[$idxm]]; - $sz = sizeof($arr); $sz--; - if($arr[$keylist[$sz]] == $arr[$keyname]) return $arr; - $arr[$keylist[$idxm]] = $arr[$keylist[$idx]]; - $arr[$keylist[$idx]] = $temp; - return $arr; + $keylist = array_keys($arr); + $keyflop = array_flip($keylist); + $idx = $keyflop[$keyname]; + $idxm = $idx + 1; + $temp = $arr[$keylist[$idxm]]; + $sz = sizeof($arr); $sz--; + if($arr[$keylist[$sz]] == $arr[$keyname]) return $arr; + $arr[$keylist[$idxm]] = $arr[$keylist[$idx]]; + $arr[$keylist[$idx]] = $temp; + return $arr; } function arrayItemTop($arr, $keyname) { - $keylist = array_keys($arr); - $keyflop = array_flip($keylist); - $idx = $keyflop[$keyname]; - while( $orig != $arr[$keylist[0]] ) { - // echo 'Keyname: '.$keylist[$idx] . '
'; flush(); ob_flush(); // Debugger - if($idx < 0) return $arr; - if($keylist[$idx] == '' || $keylist[$idx] < 0 || !$keylist[$idx]) { - return $arr; - } - $arr = arrayItemUp($arr, $keylist[$idx]); - $idx--; - } - return $arr; + $keylist = array_keys($arr); + $keyflop = array_flip($keylist); + $idx = $keyflop[$keyname]; + while( $orig != $arr[$keylist[0]] ) { + // echo 'Keyname: '.$keylist[$idx] . '
'; flush(); ob_flush(); // Debugger + if($idx < 0) return $arr; + if($keylist[$idx] == '' || $keylist[$idx] < 0 || !$keylist[$idx]) { + return $arr; + } + $arr = arrayItemUp($arr, $keylist[$idx]); + $idx--; + } + return $arr; } function arrayItemBottom($arr, $keyname) { - $b = $arr[$keyname]; - unset($arr[$keyname]); - $arr[$keyname] = $b; - unset($b); - return $arr; + $b = $arr[$keyname]; + unset($arr[$keyname]); + $arr[$keyname] = $b; + unset($b); + return $arr; } /** @@ -850,12 +850,12 @@ function enano_safe_array_merge($arr1, $arr2) { - $arr3 = $arr1; - foreach($arr2 as $k => $v) - { - $arr3[$k] = $v; - } - return $arr3; + $arr3 = $arr1; + foreach($arr2 as $k => $v) + { + $arr3[$k] = $v; + } + return $arr3; } /** @@ -866,21 +866,21 @@ function integerize_array($arr) { - if ( !is_array($arr) ) - return $arr; - - foreach ( $arr as &$val ) - { - if ( is_string($val) && ctype_digit($val) && strlen($val) < 10 ) - { - $val = intval($val); - } - else if ( is_array($val) ) - { - $val = integerize_array($val); - } - } - return $arr; + if ( !is_array($arr) ) + return $arr; + + foreach ( $arr as &$val ) + { + if ( is_string($val) && ctype_digit($val) && strlen($val) < 10 ) + { + $val = intval($val); + } + else if ( is_array($val) ) + { + $val = integerize_array($val); + } + } + return $arr; } // Convert IP address to hex string @@ -888,21 +888,21 @@ // Output: 0x7f000001 (string) // Updated 12/8/06 to work with PHP4 and not use eval() (blech) function ip2hex($ip) { - if ( preg_match('/^([0-9a-f:]+)$/', $ip) ) - { - // this is an ipv6 address - return str_replace(':', '', $ip); - } - $nums = explode('.', $ip); - if(sizeof($nums) != 4) return false; - $str = '0x'; - foreach($nums as $n) - { - $byte = (string)dechex($n); - if ( strlen($byte) < 2 ) - $byte = '0' . $byte; - } - return $str; + if ( preg_match('/^([0-9a-f:]+)$/', $ip) ) + { + // this is an ipv6 address + return str_replace(':', '', $ip); + } + $nums = explode('.', $ip); + if(sizeof($nums) != 4) return false; + $str = '0x'; + foreach($nums as $n) + { + $byte = (string)dechex($n); + if ( strlen($byte) < 2 ) + $byte = '0' . $byte; + } + return $str; } // Convert DWord to IP address @@ -910,17 +910,17 @@ // Output: 127.0.0.1 // Updated 12/8/06 to work with PHP4 and not use eval() (blech) function hex2ip($in) { - if(substr($in, 0, 2) == '0x') $ip = substr($in, 2, 8); - else $ip = substr($in, 0, 8); - $octets = enano_str_split($ip, 2); - $str = ''; - $newoct = Array(); - foreach($octets as $o) - { - $o = (int)hexdec($o); - $newoct[] = $o; - } - return implode('.', $newoct); + if(substr($in, 0, 2) == '0x') $ip = substr($in, 2, 8); + else $ip = substr($in, 0, 8); + $octets = enano_str_split($ip, 2); + $str = ''; + $newoct = Array(); + foreach($octets as $o) + { + $o = (int)hexdec($o); + $newoct[] = $o; + } + return implode('.', $newoct); } // Function strip_php moved to RenderMan class @@ -936,38 +936,38 @@ function die_semicritical($t, $p, $no_wrapper = false) { - global $db, $session, $paths, $template, $plugins; // Common objects - $db->close(); - - if ( @ob_get_status() ) - ob_end_clean(); - - // If the config hasn't been fetched yet, call grinding_halt. - if ( !defined('ENANO_CONFIG_FETCHED') ) - { - grinding_halt($t, $p); - } - - // also do grinding_halt() if we're in CLI mode - if ( defined('ENANO_CLI') ) - { - grinding_halt($t, $p); - } - - if ( $no_wrapper ) - { - echo '

' . htmlspecialchars($t) . '

'; - echo "

$p

"; - exit; - } - - $output = new Output_Safe(); - $output->set_title($t); - $output->header(); - echo $p; - $output->footer(); - - exit; + global $db, $session, $paths, $template, $plugins; // Common objects + $db->close(); + + if ( @ob_get_status() ) + ob_end_clean(); + + // If the config hasn't been fetched yet, call grinding_halt. + if ( !defined('ENANO_CONFIG_FETCHED') ) + { + grinding_halt($t, $p); + } + + // also do grinding_halt() if we're in CLI mode + if ( defined('ENANO_CLI') ) + { + grinding_halt($t, $p); + } + + if ( $no_wrapper ) + { + echo '

' . htmlspecialchars($t) . '

'; + echo "

$p

"; + exit; + } + + $output = new Output_Safe(); + $output->set_title($t); + $output->header(); + echo $p; + $output->footer(); + + exit; } /** @@ -978,20 +978,20 @@ function die_friendly($t, $p) { - global $db, $session, $paths, $template, $plugins; // Common objects - - if ( @ob_get_status() ) - ob_end_clean(); - - global $output; - - $output->set_title($t); - $template->header(); - echo $p; - $template->footer(); - $db->close(); - - exit; + global $db, $session, $paths, $template, $plugins; // Common objects + + if ( @ob_get_status() ) + ob_end_clean(); + + global $output; + + $output->set_title($t); + $template->header(); + echo $p; + $template->footer(); + $db->close(); + + exit; } /** @@ -1002,47 +1002,47 @@ function grinding_halt($t, $p) { - global $db, $session, $paths, $template, $plugins; // Common objects - - if ( !defined('scriptPath') ) - require( ENANO_ROOT . '/config.php' ); - - if ( is_object($db) ) - $db->close(); - - if ( @ob_get_status() ) - ob_end_clean(); - - if ( defined('ENANO_CLI') ) - { - // set console color - echo "\x1B[31;1m"; - // error title - echo "Critical error in Enano runtime: "; - // unbold - echo "$t\n"; - // bold - echo "\x1B[37;1m"; - echo "Error: "; - // unbold - echo "\x1B[0m"; - echo "$p\n"; - exit(1); - } - $theme = ( defined('ENANO_CONFIG_FETCHED') ) ? getConfig('theme_default') : 'oxygen'; - $style = ( defined('ENANO_CONFIG_FETCHED') ) ? '__foo__' : 'bleu'; - - $tpl = new template_nodb(); - $tpl->load_theme($theme, $style); - $tpl->tpl_strings['SITE_NAME'] = 'Critical error'; - $tpl->tpl_strings['SITE_DESC'] = 'This website is experiencing a serious error and cannot load.'; - $tpl->tpl_strings['COPYRIGHT'] = 'Unable to retrieve copyright information'; - $tpl->tpl_strings['PAGE_NAME'] = $t; - $tpl->header(); - echo $p; - $tpl->footer(); - - exit; + global $db, $session, $paths, $template, $plugins; // Common objects + + if ( !defined('scriptPath') ) + require( ENANO_ROOT . '/config.php' ); + + if ( is_object($db) ) + $db->close(); + + if ( @ob_get_status() ) + ob_end_clean(); + + if ( defined('ENANO_CLI') ) + { + // set console color + echo "\x1B[31;1m"; + // error title + echo "Critical error in Enano runtime: "; + // unbold + echo "$t\n"; + // bold + echo "\x1B[37;1m"; + echo "Error: "; + // unbold + echo "\x1B[0m"; + echo "$p\n"; + exit(1); + } + $theme = ( defined('ENANO_CONFIG_FETCHED') ) ? getConfig('theme_default') : 'oxygen'; + $style = ( defined('ENANO_CONFIG_FETCHED') ) ? '__foo__' : 'bleu'; + + $tpl = new template_nodb(); + $tpl->load_theme($theme, $style); + $tpl->tpl_strings['SITE_NAME'] = 'Critical error'; + $tpl->tpl_strings['SITE_DESC'] = 'This website is experiencing a serious error and cannot load.'; + $tpl->tpl_strings['COPYRIGHT'] = 'Unable to retrieve copyright information'; + $tpl->tpl_strings['PAGE_NAME'] = $t; + $tpl->header(); + echo $p; + $tpl->footer(); + + exit; } /** @@ -1051,7 +1051,7 @@ function show_category_info() { - throw new Exception('show_category_info() is deprecated. Use Namespace_*::display_categories().'); + throw new Exception('show_category_info() is deprecated. Use Namespace_*::display_categories().'); } /** @@ -1060,7 +1060,7 @@ function show_file_info($page = false) { - throw new Exception('show_file_info() is deprecated. Use Namespace_File::show_info().'); + throw new Exception('show_file_info() is deprecated. Use Namespace_File::show_info().'); } /** @@ -1069,7 +1069,7 @@ function display_page_headers() { - // Deprecated. + // Deprecated. } /** @@ -1078,18 +1078,18 @@ function display_page_footers() { - global $db, $session, $paths, $template, $plugins; // Common objects - - if ( isset($_GET['nofooters']) ) - { - return; - } - - $code = $plugins->setHook('send_page_footers'); - foreach ( $code as $cmd ) - { - eval($cmd); - } + global $db, $session, $paths, $template, $plugins; // Common objects + + if ( isset($_GET['nofooters']) ) + { + return; + } + + $code = $plugins->setHook('send_page_footers'); + foreach ( $code as $cmd ) + { + eval($cmd); + } } /** @@ -1100,34 +1100,34 @@ function display_redirect_notice($page_id, $namespace) { - global $db, $session, $paths, $template, $plugins; // Common objects - global $lang, $output; - - $url = makeUrlNS($namespace, $page_id, false, true); - $ns = namespace_factory($page_id, $namespace); - $page_data = $ns->get_cdata(); - - $title = $page_data['name']; - - $cls = $ns->exists() ? '' : 'class="wikilink-nonexistent" '; - - $a = '' . $title . ''; - $redir_html = '
- - - - - -
- Cute wet-floor icon - - ' . $lang->get('page_msg_this_is_a_redirector', array( 'redirect_target' => $a )) . ' -
-
-
-
'; - - $output->add_after_header($redir_html); + global $db, $session, $paths, $template, $plugins; // Common objects + global $lang, $output; + + $url = makeUrlNS($namespace, $page_id, false, true); + $ns = namespace_factory($page_id, $namespace); + $page_data = $ns->get_cdata(); + + $title = $page_data['name']; + + $cls = $ns->exists() ? '' : 'class="wikilink-nonexistent" '; + + $a = '' . $title . ''; + $redir_html = '
+ + + + + +
+ Cute wet-floor icon + + ' . $lang->get('page_msg_this_is_a_redirector', array( 'redirect_target' => $a )) . ' +
+
+
+
'; + + $output->add_after_header($redir_html); } /** @@ -1138,19 +1138,19 @@ function smtp_get_response($socket, $response, $line = __LINE__) { - $server_response = ''; - while (substr($server_response, 3, 1) != ' ') - { - if (!($server_response = fgets($socket, 256))) - { - die_friendly('SMTP Error', "

Couldn't get mail server response codes

"); - } - } - - if (!(substr($server_response, 0, 3) == $response)) - { - die_friendly('SMTP Error', "

Ran into problems sending mail. Response: $server_response

"); - } + $server_response = ''; + while (substr($server_response, 3, 1) != ' ') + { + if (!($server_response = fgets($socket, 256))) + { + die_friendly('SMTP Error', "

Couldn't get mail server response codes

"); + } + } + + if (!(substr($server_response, 0, 3) == $response)) + { + die_friendly('SMTP Error', "

Ran into problems sending mail. Response: $server_response

"); + } } /** @@ -1163,7 +1163,7 @@ function smtp_send_email($to, $subject, $message, $from) { - return smtp_send_email_core($to, $subject, $message, "From: <$from>\n"); + return smtp_send_email_core($to, $subject, $message, "From: <$from>\n"); } /** @@ -1178,184 +1178,184 @@ function smtp_send_email_core($mail_to, $subject, $message, $headers = '') { - // Fix any bare linefeeds in the message to make it RFC821 Compliant. - $message = preg_replace("#(? 1) - { - $headers = join("\n", $headers); - } - else - { - $headers = $headers[0]; - } - } - $headers = chop($headers); - - // Make sure there are no bare linefeeds in the headers - $headers = preg_replace('#(?\r\n"); - smtp_get_response($socket, "250", __LINE__); - - // Specify each user to send to and build to header. - $to_header = ''; - - // Add an additional bit of error checking to the To field. - $mail_to = (trim($mail_to) == '') ? 'Undisclosed-recipients:;' : trim($mail_to); - if (preg_match('#[^ ]+\@[^ ]+#', $mail_to)) - { - enano_fputs($socket, "RCPT TO: <$mail_to>\r\n"); - smtp_get_response($socket, "250", __LINE__); - } - - // Ok now do the CC and BCC fields... - @reset($bcc); - while(list(, $bcc_address) = each($bcc)) - { - // Add an additional bit of error checking to bcc header... - $bcc_address = trim($bcc_address); - if (preg_match('#[^ ]+\@[^ ]+#', $bcc_address)) - { - enano_fputs($socket, "RCPT TO: <$bcc_address>\r\n"); - smtp_get_response($socket, "250", __LINE__); - } - } - - @reset($cc); - while(list(, $cc_address) = each($cc)) - { - // Add an additional bit of error checking to cc header - $cc_address = trim($cc_address); - if (preg_match('#[^ ]+\@[^ ]+#', $cc_address)) - { - enano_fputs($socket, "RCPT TO: <$cc_address>\r\n"); - smtp_get_response($socket, "250", __LINE__); - } - } - - // Ok now we tell the server we are ready to start sending data - enano_fputs($socket, "DATA\r\n"); - - // This is the last response code we look for until the end of the message. - smtp_get_response($socket, "354", __LINE__); - - // Send the Subject Line... - enano_fputs($socket, "Subject: $subject\r\n"); - - // Now the To Header. - enano_fputs($socket, "To: $mail_to\r\n"); - - // Now any custom headers.... - enano_fputs($socket, "$headers\r\n\r\n"); - - // Ok now we are ready for the message... - enano_fputs($socket, "$message\r\n"); - - // Ok the all the ingredients are mixed in let's cook this puppy... - enano_fputs($socket, ".\r\n"); - smtp_get_response($socket, "250", __LINE__); - - // Now tell the server we are done and close the socket... - enano_fputs($socket, "QUIT\r\n"); - fclose($socket); - - return TRUE; + // Fix any bare linefeeds in the message to make it RFC821 Compliant. + $message = preg_replace("#(? 1) + { + $headers = join("\n", $headers); + } + else + { + $headers = $headers[0]; + } + } + $headers = chop($headers); + + // Make sure there are no bare linefeeds in the headers + $headers = preg_replace('#(?\r\n"); + smtp_get_response($socket, "250", __LINE__); + + // Specify each user to send to and build to header. + $to_header = ''; + + // Add an additional bit of error checking to the To field. + $mail_to = (trim($mail_to) == '') ? 'Undisclosed-recipients:;' : trim($mail_to); + if (preg_match('#[^ ]+\@[^ ]+#', $mail_to)) + { + enano_fputs($socket, "RCPT TO: <$mail_to>\r\n"); + smtp_get_response($socket, "250", __LINE__); + } + + // Ok now do the CC and BCC fields... + @reset($bcc); + while(list(, $bcc_address) = each($bcc)) + { + // Add an additional bit of error checking to bcc header... + $bcc_address = trim($bcc_address); + if (preg_match('#[^ ]+\@[^ ]+#', $bcc_address)) + { + enano_fputs($socket, "RCPT TO: <$bcc_address>\r\n"); + smtp_get_response($socket, "250", __LINE__); + } + } + + @reset($cc); + while(list(, $cc_address) = each($cc)) + { + // Add an additional bit of error checking to cc header + $cc_address = trim($cc_address); + if (preg_match('#[^ ]+\@[^ ]+#', $cc_address)) + { + enano_fputs($socket, "RCPT TO: <$cc_address>\r\n"); + smtp_get_response($socket, "250", __LINE__); + } + } + + // Ok now we tell the server we are ready to start sending data + enano_fputs($socket, "DATA\r\n"); + + // This is the last response code we look for until the end of the message. + smtp_get_response($socket, "354", __LINE__); + + // Send the Subject Line... + enano_fputs($socket, "Subject: $subject\r\n"); + + // Now the To Header. + enano_fputs($socket, "To: $mail_to\r\n"); + + // Now any custom headers.... + enano_fputs($socket, "$headers\r\n\r\n"); + + // Ok now we are ready for the message... + enano_fputs($socket, "$message\r\n"); + + // Ok the all the ingredients are mixed in let's cook this puppy... + enano_fputs($socket, ".\r\n"); + smtp_get_response($socket, "250", __LINE__); + + // Now tell the server we are done and close the socket... + enano_fputs($socket, "QUIT\r\n"); + fclose($socket); + + return TRUE; } /** @@ -1367,24 +1367,24 @@ function enano_version($long = false, $no_nightly = false) { - if ( !defined('ENANO_CONFIG_FETCHED') ) - { - return function_exists('installer_enano_version') ? installer_enano_version() : $GLOBALS['enano_version']; - } - $r = getConfig('enano_version'); - $rc = ( $long ) ? ' release candidate ' : 'RC'; - $b = ( $long ) ? ' beta ' : 'b'; - $a = ( $long ) ? ' alpha ' : 'a'; - if($v = getConfig('enano_rc_version')) $r .= $rc.$v; - if($v = getConfig('enano_beta_version')) $r .= $b.$v; - if($v = getConfig('enano_alpha_version')) $r .= $a.$v; - if ( defined('ENANO_NIGHTLY') && !$no_nightly ) - { - $nightlytag = ENANO_NIGHTLY_MONTH . '-' . ENANO_NIGHTLY_DAY . '-' . ENANO_NIGHTLY_YEAR; - $nightlylong = ' nightly; build date: ' . ENANO_NIGHTLY_MONTH . '-' . ENANO_NIGHTLY_DAY . '-' . ENANO_NIGHTLY_YEAR; - $r = ( $long ) ? $r . $nightlylong : $r . '-nightly-' . $nightlytag; - } - return $r; + if ( !defined('ENANO_CONFIG_FETCHED') ) + { + return function_exists('installer_enano_version') ? installer_enano_version() : $GLOBALS['enano_version']; + } + $r = getConfig('enano_version'); + $rc = ( $long ) ? ' release candidate ' : 'RC'; + $b = ( $long ) ? ' beta ' : 'b'; + $a = ( $long ) ? ' alpha ' : 'a'; + if($v = getConfig('enano_rc_version')) $r .= $rc.$v; + if($v = getConfig('enano_beta_version')) $r .= $b.$v; + if($v = getConfig('enano_alpha_version')) $r .= $a.$v; + if ( defined('ENANO_NIGHTLY') && !$no_nightly ) + { + $nightlytag = ENANO_NIGHTLY_MONTH . '-' . ENANO_NIGHTLY_DAY . '-' . ENANO_NIGHTLY_YEAR; + $nightlylong = ' nightly; build date: ' . ENANO_NIGHTLY_MONTH . '-' . ENANO_NIGHTLY_DAY . '-' . ENANO_NIGHTLY_YEAR; + $r = ( $long ) ? $r . $nightlylong : $r . '-nightly-' . $nightlytag; + } + return $r; } /** @@ -1394,31 +1394,31 @@ function enano_codename() { - $names = array( - '1.0RC1' => 'Leprechaun', - '1.0RC2' => 'Clurichaun', - '1.0RC3' => 'Druid', - '1.0' => 'Banshee', - '1.0.1' => 'Loch Ness', - '1.0.1.1'=> 'Loch Ness internal bugfix build', - '1.0.2b1'=> 'Coblynau unstable', - '1.0.2' => 'Coblynau', - '1.0.3' => 'Dyrad', - '1.1.1' => 'Caoineag alpha 1', - '1.1.2' => 'Caoineag alpha 2', - '1.1.3' => 'Caoineag alpha 3', - '1.1.4' => 'Caoineag alpha 4', - '1.1.5' => 'Caoineag alpha 5', - '1.1.6' => 'Caoineag beta 1', - '1.1.7' => 'Caoineag beta 2', - '1.1.8' => 'Caoineag beta 3', - ); - $version = enano_version(); - if ( isset($names[$version]) ) - { - return $names[$version]; - } - return 'Anonymous build'; + $names = array( + '1.0RC1' => 'Leprechaun', + '1.0RC2' => 'Clurichaun', + '1.0RC3' => 'Druid', + '1.0' => 'Banshee', + '1.0.1' => 'Loch Ness', + '1.0.1.1'=> 'Loch Ness internal bugfix build', + '1.0.2b1'=> 'Coblynau unstable', + '1.0.2' => 'Coblynau', + '1.0.3' => 'Dyrad', + '1.1.1' => 'Caoineag alpha 1', + '1.1.2' => 'Caoineag alpha 2', + '1.1.3' => 'Caoineag alpha 3', + '1.1.4' => 'Caoineag alpha 4', + '1.1.5' => 'Caoineag alpha 5', + '1.1.6' => 'Caoineag beta 1', + '1.1.7' => 'Caoineag beta 2', + '1.1.8' => 'Caoineag beta 3', + ); + $version = enano_version(); + if ( isset($names[$version]) ) + { + return $names[$version]; + } + return 'Anonymous build'; } /** @@ -1427,8 +1427,8 @@ */ function _die($t) { - $_ob = 'document.getElementById("ajaxEditContainer").innerHTML = unescape(\'' . rawurlencode('' . $t . '') . '\')'; - die($_ob); + $_ob = 'document.getElementById("ajaxEditContainer").innerHTML = unescape(\'' . rawurlencode('' . $t . '') . '\')'; + die($_ob); } /** @@ -1437,9 +1437,9 @@ */ function jsdie($text) { - global $db, $session, $paths, $template, $plugins; // Common objects - $text = rawurlencode($text . "\n\nSQL Backtrace:\n" . $db->sql_backtrace()); - echo 'document.getElementById("ajaxEditContainer").innerHTML = unescape(\''.$text.'\');'; + global $db, $session, $paths, $template, $plugins; // Common objects + $text = rawurlencode($text . "\n\nSQL Backtrace:\n" . $db->sql_backtrace()); + echo 'document.getElementById("ajaxEditContainer").innerHTML = unescape(\''.$text.'\');'; } /** @@ -1450,7 +1450,7 @@ function capitalize_first_letter($text) { - return strtoupper(substr($text, 0, 1)) . substr($text, 1); + return strtoupper(substr($text, 0, 1)) . substr($text, 1); } /** @@ -1462,7 +1462,7 @@ function is_bit($bitfield, $value) { - return ( $bitfield & $value ) ? true : false; + return ( $bitfield & $value ) ? true : false; } /** @@ -1473,16 +1473,16 @@ function trim_spaces($text) { - $d = true; - while($d) - { - $c = substr($text, 0, 1); - $a = substr($text, strlen($text)-1, strlen($text)); - if($c == "\n" || $c == "\r" || $c == "\t" || $c == ' ') $text = substr($text, 1, strlen($text)); - elseif($a == "\n" || $a == "\r" || $a == "\t" || $a == ' ') $text = substr($text, 0, strlen($text)-1); - else $d = false; - } - return $text; + $d = true; + while($d) + { + $c = substr($text, 0, 1); + $a = substr($text, strlen($text)-1, strlen($text)); + if($c == "\n" || $c == "\r" || $c == "\t" || $c == ' ') $text = substr($text, 1, strlen($text)); + elseif($a == "\n" || $a == "\r" || $a == "\t" || $a == ' ') $text = substr($text, 0, strlen($text)-1); + else $d = false; + } + return $text; } /** @@ -1494,21 +1494,21 @@ function enano_str_split($text, $inc = 1) { - if($inc < 1) - { - return false; - } - if($inc >= strlen($text)) - { - return Array($text); - } - $len = ceil(strlen($text) / $inc); - $ret = Array(); - for ( $i = 0; $i < strlen($text); $i = $i + $inc ) - { - $ret[] = substr($text, $i, $inc); - } - return $ret; + if($inc < 1) + { + return false; + } + if($inc >= strlen($text)) + { + return Array($text); + } + $len = ceil(strlen($text) / $inc); + $ret = Array(); + for ( $i = 0; $i < strlen($text); $i = $i + $inc ) + { + $ret[] = substr($text, $i, $inc); + } + return $ret; } /** @@ -1518,13 +1518,13 @@ */ function hex2bin($text) { - $arr = enano_str_split($text, 2); - $ret = ''; - for ($i=0; $i'; - if ( function_exists('debug_print_backtrace') ) - { - debug_print_backtrace(); - } - else - { - echo 'Warning: No debug_print_backtrace() support!'; - } - if ( !$return ) - echo ''; - $c = ob_get_contents(); - ob_end_clean(); - if($return) return $c; - else echo $c; - return null; + ob_start(); + if ( !$return ) + echo '
';
+	if ( function_exists('debug_print_backtrace') )
+	{
+		debug_print_backtrace();
+	}
+	else
+	{
+		echo 'Warning: No debug_print_backtrace() support!';
+	}
+	if ( !$return )
+		echo '
'; + $c = ob_get_contents(); + ob_end_clean(); + if($return) return $c; + else echo $c; + return null; } /** @@ -1565,15 +1565,15 @@ function hexencode($text, $prefix = '%', $suffix = '') { - $arr = enano_str_split($text); - $r = ''; - foreach($arr as $a) - { - $nibble = (string)dechex(ord($a)); - if(strlen($nibble) == 1) $nibble = '0' . $nibble; - $r .= $prefix . $nibble . $suffix; - } - return $r; + $arr = enano_str_split($text); + $r = ''; + foreach($arr as $a) + { + $nibble = (string)dechex(ord($a)); + if(strlen($nibble) == 1) $nibble = '0' . $nibble; + $r .= $prefix . $nibble . $suffix; + } + return $r; } /** @@ -1583,14 +1583,14 @@ function enano_get_magic_quotes_gpc() { - if(function_exists('get_magic_quotes_gpc')) - { - return ( get_magic_quotes_gpc() == 1 ); - } - else - { - return ( strtolower(@ini_get('magic_quotes_gpc')) == '1' ); - } + if(function_exists('get_magic_quotes_gpc')) + { + return ( get_magic_quotes_gpc() == 1 ); + } + else + { + return ( strtolower(@ini_get('magic_quotes_gpc')) == '1' ); + } } /** @@ -1601,15 +1601,15 @@ function stripslashes_recurse($arr) { - foreach($arr as $k => $xxxx) - { - $val =& $arr[$k]; - if(is_string($val)) - $val = stripslashes($val); - elseif(is_array($val)) - $val = stripslashes_recurse($val); - } - return $arr; + foreach($arr as $k => $xxxx) + { + $val =& $arr[$k]; + if(is_string($val)) + $val = stripslashes($val); + elseif(is_array($val)) + $val = stripslashes_recurse($val); + } + return $arr; } /** @@ -1620,15 +1620,15 @@ function strip_nul_chars($arr) { - foreach($arr as $k => $xxxx_unused) - { - $val =& $arr[$k]; - if(is_string($val)) - $val = str_replace("\000", '', $val); - elseif(is_array($val)) - $val = strip_nul_chars($val); - } - return $arr; + foreach($arr as $k => $xxxx_unused) + { + $val =& $arr[$k]; + if(is_string($val)) + $val = str_replace("\000", '', $val); + elseif(is_array($val)) + $val = strip_nul_chars($val); + } + return $arr; } /** @@ -1639,21 +1639,21 @@ */ function strip_magic_quotes_gpc() { - if(enano_get_magic_quotes_gpc()) - { - $_POST = stripslashes_recurse($_POST); - $_GET = stripslashes_recurse($_GET); - $_COOKIE = stripslashes_recurse($_COOKIE); - $_REQUEST = stripslashes_recurse($_REQUEST); - } - $_POST = strip_nul_chars($_POST); - $_GET = strip_nul_chars($_GET); - $_COOKIE = strip_nul_chars($_COOKIE); - $_REQUEST = strip_nul_chars($_REQUEST); - $_POST = decode_unicode_array($_POST); - $_GET = decode_unicode_array($_GET); - $_COOKIE = decode_unicode_array($_COOKIE); - $_REQUEST = decode_unicode_array($_REQUEST); + if(enano_get_magic_quotes_gpc()) + { + $_POST = stripslashes_recurse($_POST); + $_GET = stripslashes_recurse($_GET); + $_COOKIE = stripslashes_recurse($_COOKIE); + $_REQUEST = stripslashes_recurse($_REQUEST); + } + $_POST = strip_nul_chars($_POST); + $_GET = strip_nul_chars($_GET); + $_COOKIE = strip_nul_chars($_COOKIE); + $_REQUEST = strip_nul_chars($_REQUEST); + $_POST = decode_unicode_array($_POST); + $_GET = decode_unicode_array($_GET); + $_COOKIE = decode_unicode_array($_COOKIE); + $_REQUEST = decode_unicode_array($_REQUEST); } /** @@ -1664,42 +1664,42 @@ function compress_bitfield($bits) { - if ( !preg_match('/^[01]+$/', $bits) ) - return false; - - $current = intval($bits{0}); - $clen = 0; - $out = ''; - for ( $i = 0; $i < strlen($bits); $i++ ) - { - $cbit = intval($bits{$i}); - if ( $cbit !== $current || $clen == 127 || $i == strlen($bits) - 1 ) - { - if ( $i == strlen($bits) - 1 && $cbit === $current ) - { - $clen++; - } - // write chunk - $byte = $clen; - if ( $current === 1 ) - $byte |= 0x80; - $out .= chr($byte); - - if ( $i == strlen($bits) - 1 && $cbit !== $current ) - { - $out .= ( $cbit === 1 ) ? chr(0x81) : chr(0x1); - } - - // reset - $current = intval($cbit); - $clen = 0; - } - $clen++; - } - $crc = dechex(crc32($out)); - while ( strlen($crc) < 8 ) - $crc = "0$crc"; - return "cbf2:{$crc}" . hexencode($out, '', ''); + if ( !preg_match('/^[01]+$/', $bits) ) + return false; + + $current = intval($bits{0}); + $clen = 0; + $out = ''; + for ( $i = 0; $i < strlen($bits); $i++ ) + { + $cbit = intval($bits{$i}); + if ( $cbit !== $current || $clen == 127 || $i == strlen($bits) - 1 ) + { + if ( $i == strlen($bits) - 1 && $cbit === $current ) + { + $clen++; + } + // write chunk + $byte = $clen; + if ( $current === 1 ) + $byte |= 0x80; + $out .= chr($byte); + + if ( $i == strlen($bits) - 1 && $cbit !== $current ) + { + $out .= ( $cbit === 1 ) ? chr(0x81) : chr(0x1); + } + + // reset + $current = intval($cbit); + $clen = 0; + } + $clen++; + } + $crc = dechex(crc32($out)); + while ( strlen($crc) < 8 ) + $crc = "0$crc"; + return "cbf2:{$crc}" . hexencode($out, '', ''); } // test case @@ -1714,36 +1714,36 @@ function uncompress_bitfield($bits) { - if ( substr($bits, 0, 4) == 'cbf:' ) - { - return uncompress_bitfield_old($bits); - } - if ( substr($bits, 0, 5) != 'cbf2:' ) - { - echo __FUNCTION__.'(): ERROR: Invalid stream'; - return false; - } - $bits = substr($bits, 5); - $crc = substr($bits, 0, 8); - $bits = substr($bits, 8); - $bits = hexdecode($bits); - if ( dechex(crc32($bits)) !== $crc ) - { - echo __FUNCTION__."(): ERROR: CRC failed"; - return false; - } - $out = ''; - for ( $i = 0; $i < strlen($bits); $i++ ) - { - $byte = ord($bits{$i}); - $char = $byte & 0x80 ? '1' : '0'; - $byte &= ~0x80; - for ( $j = 0; $j < $byte; $j++ ) - { - $out .= $char; - } - } - return $out; + if ( substr($bits, 0, 4) == 'cbf:' ) + { + return uncompress_bitfield_old($bits); + } + if ( substr($bits, 0, 5) != 'cbf2:' ) + { + echo __FUNCTION__.'(): ERROR: Invalid stream'; + return false; + } + $bits = substr($bits, 5); + $crc = substr($bits, 0, 8); + $bits = substr($bits, 8); + $bits = hexdecode($bits); + if ( dechex(crc32($bits)) !== $crc ) + { + echo __FUNCTION__."(): ERROR: CRC failed"; + return false; + } + $out = ''; + for ( $i = 0; $i < strlen($bits); $i++ ) + { + $byte = ord($bits{$i}); + $char = $byte & 0x80 ? '1' : '0'; + $byte &= ~0x80; + for ( $j = 0; $j < $byte; $j++ ) + { + $out .= $char; + } + } + return $out; } /** @@ -1755,34 +1755,34 @@ function uncompress_bitfield_old($bits) { - if(substr($bits, 0, 4) != 'cbf:') - { - echo __FUNCTION__.'(): ERROR: Invalid stream'; - return false; - } - $len = intval(substr($bits, strpos($bits, 'len=')+4, strpos($bits, ';')-strpos($bits, 'len=')-4)); - $crc = substr($bits, strpos($bits, 'crc=')+4, 8); - $data = substr($bits, strpos($bits, 'data=')+5, strpos($bits, '|end')-strpos($bits, 'data=')-5); - $data = explode(',', $data); - foreach($data as $a => $b) - { - $d =& $data[$a]; - $char = substr($d, 0, 1); - $dlen = intval(substr($d, 2, strlen($d)-1)); - $s = ''; - for($i=0;$i<$dlen;$i++,$s.=$char); - $d = $s; - unset($s, $dlen, $char); - } - $decompressed = implode('', $data); - $decompressed = substr($decompressed, 0, -1); - $dcrc = (string)dechex(crc32($decompressed)); - if($dcrc != $crc) - { - echo __FUNCTION__.'(): ERROR: CRC check failed
debug info:
original crc: '.$crc.'
decomp\'ed crc: '.$dcrc.'
'; - return false; - } - return $decompressed; + if(substr($bits, 0, 4) != 'cbf:') + { + echo __FUNCTION__.'(): ERROR: Invalid stream'; + return false; + } + $len = intval(substr($bits, strpos($bits, 'len=')+4, strpos($bits, ';')-strpos($bits, 'len=')-4)); + $crc = substr($bits, strpos($bits, 'crc=')+4, 8); + $data = substr($bits, strpos($bits, 'data=')+5, strpos($bits, '|end')-strpos($bits, 'data=')-5); + $data = explode(',', $data); + foreach($data as $a => $b) + { + $d =& $data[$a]; + $char = substr($d, 0, 1); + $dlen = intval(substr($d, 2, strlen($d)-1)); + $s = ''; + for($i=0;$i<$dlen;$i++,$s.=$char); + $d = $s; + unset($s, $dlen, $char); + } + $decompressed = implode('', $data); + $decompressed = substr($decompressed, 0, -1); + $dcrc = (string)dechex(crc32($decompressed)); + if($dcrc != $crc) + { + echo __FUNCTION__.'(): ERROR: CRC check failed
debug info:
original crc: '.$crc.'
decomp\'ed crc: '.$dcrc.'
'; + return false; + } + return $decompressed; } /** @@ -1796,125 +1796,125 @@ function export_table($table, $structure = true, $data = true, $compact = false) { - global $db, $session, $paths, $template, $plugins; // Common objects - $struct_keys = ''; - $divider = (!$compact) ? "\n" : "\n"; - $spacer1 = (!$compact) ? "\n" : " "; - $spacer2 = (!$compact) ? " " : " "; - $rowspacer = (!$compact) ? "\n " : " "; - $index_list = Array(); - $cols = $db->sql_query('SHOW COLUMNS IN '.$table.';'); - if(!$cols) - { - echo 'export_table(): Error getting column list: '.$db->get_error_text().'
'; - return false; - } - $col = Array(); - $sqlcol = Array(); - $collist = Array(); - $pri_keys = Array(); - // Using fetchrow_num() here to compensate for MySQL l10n - while( $row = $db->fetchrow_num() ) - { - $field =& $row[0]; - $type =& $row[1]; - $null =& $row[2]; - $key =& $row[3]; - $def =& $row[4]; - $extra =& $row[5]; - $col[] = Array( - 'name'=>$field, - 'type'=>$type, - 'null'=>$null, - 'key'=>$key, - 'default'=>$def, - 'extra'=>$extra, - ); - $collist[] = $field; - } - - if ( $structure ) - { - $db->sql_query('SET SQL_QUOTE_SHOW_CREATE = 0;'); - $struct = $db->sql_query('SHOW CREATE TABLE '.$table.';'); - if ( !$struct ) - $db->_die(); - $row = $db->fetchrow_num(); - $db->free_result(); - $struct = $row[1]; - $struct = preg_replace("/\n\) ENGINE=(.+)$/", "\n);", $struct); - unset($row); - if ( $compact ) - { - $struct_arr = explode("\n", $struct); - foreach ( $struct_arr as $i => $leg ) - { - if ( $i == 0 ) - continue; - $test = trim($leg); - if ( empty($test) ) - { - unset($struct_arr[$i]); - continue; - } - $struct_arr[$i] = preg_replace('/^([\s]*)/', ' ', $leg); - } - $struct = implode("", $struct_arr); - } - } - - // Structuring complete - if($data) - { - $datq = $db->sql_query('SELECT * FROM '.$table.';'); - if(!$datq) - { - echo 'export_table(): Error getting column list: '.$db->get_error_text().'
'; - return false; - } - if($db->numrows() < 1) - { - if($structure) return $struct; - else return ''; - } - $rowdata = Array(); - $dataqs = Array(); - $insert_strings = Array(); - $z = false; - while($row = $db->fetchrow_num()) - { - $z = false; - foreach($row as $i => $cell) - { - $str = mysql_encode_column($cell, $col[$i]['type']); - $rowdata[] = $str; - } - $dataqs2 = implode(",$rowspacer", $dataqs) . ",$rowspacer" . '( ' . implode(', ', $rowdata) . ' )'; - $ins = 'INSERT INTO '.$table.'( '.implode(',', $collist).' ) VALUES' . $dataqs2 . ";"; - if ( strlen( $ins ) > MYSQL_MAX_PACKET_SIZE ) - { - // We've exceeded the maximum allowed packet size for MySQL - separate this into a different query - $insert_strings[] = 'INSERT INTO '.$table.'( '.implode(',', $collist).' ) VALUES' . implode(",$rowspacer", $dataqs) . ";";; - $dataqs = Array('( ' . implode(', ', $rowdata) . ' )'); - $z = true; - } - else - { - $dataqs[] = '( ' . implode(', ', $rowdata) . ' )'; - } - $rowdata = Array(); - } - if ( !$z ) - { - $insert_strings[] = 'INSERT INTO '.$table.'( '.implode(',', $collist).' ) VALUES' . implode(",$rowspacer", $dataqs) . ";";; - $dataqs = Array(); - } - $datstring = implode($divider, $insert_strings); - } - if($structure && !$data) return $struct; - elseif(!$structure && $data) return $datstring; - elseif($structure && $data) return $struct . $divider . $datstring; - elseif(!$structure && !$data) return ''; + global $db, $session, $paths, $template, $plugins; // Common objects + $struct_keys = ''; + $divider = (!$compact) ? "\n" : "\n"; + $spacer1 = (!$compact) ? "\n" : " "; + $spacer2 = (!$compact) ? " " : " "; + $rowspacer = (!$compact) ? "\n " : " "; + $index_list = Array(); + $cols = $db->sql_query('SHOW COLUMNS IN '.$table.';'); + if(!$cols) + { + echo 'export_table(): Error getting column list: '.$db->get_error_text().'
'; + return false; + } + $col = Array(); + $sqlcol = Array(); + $collist = Array(); + $pri_keys = Array(); + // Using fetchrow_num() here to compensate for MySQL l10n + while( $row = $db->fetchrow_num() ) + { + $field =& $row[0]; + $type =& $row[1]; + $null =& $row[2]; + $key =& $row[3]; + $def =& $row[4]; + $extra =& $row[5]; + $col[] = Array( + 'name'=>$field, + 'type'=>$type, + 'null'=>$null, + 'key'=>$key, + 'default'=>$def, + 'extra'=>$extra, + ); + $collist[] = $field; + } + + if ( $structure ) + { + $db->sql_query('SET SQL_QUOTE_SHOW_CREATE = 0;'); + $struct = $db->sql_query('SHOW CREATE TABLE '.$table.';'); + if ( !$struct ) + $db->_die(); + $row = $db->fetchrow_num(); + $db->free_result(); + $struct = $row[1]; + $struct = preg_replace("/\n\) ENGINE=(.+)$/", "\n);", $struct); + unset($row); + if ( $compact ) + { + $struct_arr = explode("\n", $struct); + foreach ( $struct_arr as $i => $leg ) + { + if ( $i == 0 ) + continue; + $test = trim($leg); + if ( empty($test) ) + { + unset($struct_arr[$i]); + continue; + } + $struct_arr[$i] = preg_replace('/^([\s]*)/', ' ', $leg); + } + $struct = implode("", $struct_arr); + } + } + + // Structuring complete + if($data) + { + $datq = $db->sql_query('SELECT * FROM '.$table.';'); + if(!$datq) + { + echo 'export_table(): Error getting column list: '.$db->get_error_text().'
'; + return false; + } + if($db->numrows() < 1) + { + if($structure) return $struct; + else return ''; + } + $rowdata = Array(); + $dataqs = Array(); + $insert_strings = Array(); + $z = false; + while($row = $db->fetchrow_num()) + { + $z = false; + foreach($row as $i => $cell) + { + $str = mysql_encode_column($cell, $col[$i]['type']); + $rowdata[] = $str; + } + $dataqs2 = implode(",$rowspacer", $dataqs) . ",$rowspacer" . '( ' . implode(', ', $rowdata) . ' )'; + $ins = 'INSERT INTO '.$table.'( '.implode(',', $collist).' ) VALUES' . $dataqs2 . ";"; + if ( strlen( $ins ) > MYSQL_MAX_PACKET_SIZE ) + { + // We've exceeded the maximum allowed packet size for MySQL - separate this into a different query + $insert_strings[] = 'INSERT INTO '.$table.'( '.implode(',', $collist).' ) VALUES' . implode(",$rowspacer", $dataqs) . ";";; + $dataqs = Array('( ' . implode(', ', $rowdata) . ' )'); + $z = true; + } + else + { + $dataqs[] = '( ' . implode(', ', $rowdata) . ' )'; + } + $rowdata = Array(); + } + if ( !$z ) + { + $insert_strings[] = 'INSERT INTO '.$table.'( '.implode(',', $collist).' ) VALUES' . implode(",$rowspacer", $dataqs) . ";";; + $dataqs = Array(); + } + $datstring = implode($divider, $insert_strings); + } + if($structure && !$data) return $struct; + elseif(!$structure && $data) return $datstring; + elseif($structure && $data) return $struct . $divider . $datstring; + elseif(!$structure && !$data) return ''; } /** @@ -1924,25 +1924,25 @@ function mysql_encode_column($input, $type) { - global $db, $session, $paths, $template, $plugins; // Common objects - // Decide whether to quote the string or not - if(substr($type, 0, 7) == 'varchar' || $type == 'datetime' || $type == 'text' || $type == 'tinytext' || $type == 'smalltext' || $type == 'longtext' || substr($type, 0, 4) == 'char') - { - $str = "'" . $db->escape($input) . "'"; - } - elseif(in_array($type, Array('blob', 'longblob', 'mediumblob', 'smallblob')) || substr($type, 0, 6) == 'binary' || substr($type, 0, 9) == 'varbinary') - { - $str = '0x' . hexencode($input, '', ''); - } - elseif(is_null($input)) - { - $str = 'NULL'; - } - else - { - $str = (string)$input; - } - return $str; + global $db, $session, $paths, $template, $plugins; // Common objects + // Decide whether to quote the string or not + if(substr($type, 0, 7) == 'varchar' || $type == 'datetime' || $type == 'text' || $type == 'tinytext' || $type == 'smalltext' || $type == 'longtext' || substr($type, 0, 4) == 'char') + { + $str = "'" . $db->escape($input) . "'"; + } + elseif(in_array($type, Array('blob', 'longblob', 'mediumblob', 'smallblob')) || substr($type, 0, 6) == 'binary' || substr($type, 0, 9) == 'varbinary') + { + $str = '0x' . hexencode($input, '', ''); + } + elseif(is_null($input)) + { + $str = 'NULL'; + } + else + { + $str = (string)$input; + } + return $str; } /** @@ -1952,19 +1952,19 @@ function fetch_allowed_extensions() { - global $mime_types; - $bits = getConfig('allowed_mime_types'); - if(!$bits) return Array(false); - $bits = uncompress_bitfield($bits); - if(!$bits) return Array(false); - $bits = enano_str_split($bits, 1); - $ret = Array(); - $mt = array_keys($mime_types); - foreach($bits as $i => $b) - { - $ret[$mt[$i]] = ( $b == '1' ) ? true : false; - } - return $ret; + global $mime_types; + $bits = getConfig('allowed_mime_types'); + if(!$bits) return Array(false); + $bits = uncompress_bitfield($bits); + if(!$bits) return Array(false); + $bits = enano_str_split($bits, 1); + $ret = Array(); + $mt = array_keys($mime_types); + foreach($bits as $i => $b) + { + $ret[$mt[$i]] = ( $b == '1' ) ? true : false; + } + return $ret; } /** @@ -1975,12 +1975,12 @@ function randkey($len = 32) { - $key = ''; - for($i=0;$i<$len;$i++) - { - $key .= chr(mt_rand(0, 255)); - } - return $key; + $key = ''; + for($i=0;$i<$len;$i++) + { + $key .= chr(mt_rand(0, 255)); + } + return $key; } /** @@ -1991,14 +1991,14 @@ function hexdecode($hex) { - $hex = enano_str_split($hex, 2); - $bin_key = ''; - foreach($hex as $nibble) - { - $byte = chr(hexdec($nibble)); - $bin_key .= $byte; - } - return $bin_key; + $hex = enano_str_split($hex, 2); + $bin_key = ''; + foreach($hex as $nibble) + { + $byte = chr(hexdec($nibble)); + $bin_key .= $byte; + } + return $bin_key; } /** @@ -2009,166 +2009,166 @@ function sanitize_html($html, $filter_php = true) { - // Random seed for substitution - $rand_seed = md5( sha1(microtime()) . mt_rand() ); - - // We need MediaWiki - require_once(ENANO_ROOT . '/includes/wikiengine/TagSanitizer.php'); - - // Strip out comments that are already escaped - preg_match_all('/<!--(.*?)-->/', $html, $comment_match); - $i = 0; - foreach ( $comment_match[0] as $comment ) - { - $html = str_replace_once($comment, "{HTMLCOMMENT:$i:$rand_seed}", $html); - $i++; - } - - // Strip out code sections that will be postprocessed by Text_Wiki - preg_match_all(';^]*)?>((?:(?R)|.)*?)(\s|$);msi', $html, $code_match); - $i = 0; - foreach ( $code_match[0] as $code ) - { - $html = str_replace_once($code, "{TW_CODE:$i:$rand_seed}", $html); - $i++; - } - - $html = preg_replace('#<([a-z]+)([\s]+)([^>]+?)'.htmlalternatives('javascript:').'(.+?)>(.*?)#is', '<\\1\\2\\3javascript:\\59>\\60</\\1>', $html); - $html = preg_replace('#<([a-z]+)([\s]+)([^>]+?)'.htmlalternatives('javascript:').'(.+?)>#is', '<\\1\\2\\3javascript:\\59>', $html); - - if($filter_php) - $html = str_replace( - Array('', '%>'), - Array('<?php', '<?', '<%', '?>', '%>'), - $html); - - $tag_whitelist = array_keys ( setupAttributeWhitelist() ); - if ( !$filter_php ) - $tag_whitelist[] = '?php'; - // allow HTML comments - $tag_whitelist[] = '!--'; - $len = strlen($html); - $in_quote = false; - $quote_char = ''; - $tag_start = 0; - $tag_name = ''; - $in_tag = false; - $trk_name = false; - for ( $i = 0; $i < $len; $i++ ) - { - $chr = $html{$i}; - $prev = ( $i == 0 ) ? '' : $html{ $i - 1 }; - $next = ( ( $i + 1 ) == $len ) ? '' : $html { $i + 1 }; - if ( $in_quote && $in_tag ) - { - if ( $quote_char == $chr && $prev != '\\' ) - $in_quote = false; - } - elseif ( ( $chr == '"' || $chr == "'" ) && $prev != '\\' && $in_tag ) - { - $in_quote = true; - $quote_char = $chr; - } - if ( $chr == '<' && !$in_tag && $next != '/' ) - { - // start of a tag - $tag_start = $i; - $in_tag = true; - $trk_name = true; - } - elseif ( !$in_quote && $in_tag && $chr == '>' ) - { - $full_tag = substr($html, $tag_start, ( $i - $tag_start ) + 1 ); - $l = strlen($tag_name) + 2; - $attribs_only = trim( substr($full_tag, $l, ( strlen($full_tag) - $l - 1 ) ) ); - - // Debugging message - // echo htmlspecialchars($full_tag) . '
'; - - if ( !in_array($tag_name, $tag_whitelist) && substr($tag_name, 0, 3) != '!--' ) - { - // Illegal tag - //echo $tag_name . ' '; - - $s = ( empty($attribs_only) ) ? '' : ' '; - - $sanitized = '<' . $tag_name . $s . $attribs_only . '>'; - - $html = substr($html, 0, $tag_start) . $sanitized . substr($html, $i + 1); - $html = str_replace('', '</' . $tag_name . '>', $html); - $new_i = $tag_start + strlen($sanitized); - - $len = strlen($html); - $i = $new_i; - - $in_tag = false; - $tag_name = ''; - continue; - } - else - { - // If not filtering PHP, don't bother to strip - if ( $tag_name == '?php' && !$filter_php ) - continue; - // If this is a comment, likewise skip this "tag" - if ( $tag_name == '!--' ) - continue; - $f = fixTagAttributes( $attribs_only, $tag_name ); - $s = ( empty($f) ) ? '' : ' '; - - $sanitized = '<' . $tag_name . $f . '>'; - $new_i = $tag_start + strlen($sanitized); - - $html = substr($html, 0, $tag_start) . $sanitized . substr($html, $i + 1); - $len = strlen($html); - $i = $new_i; - - $in_tag = false; - $tag_name = ''; - continue; - } - } - elseif ( $in_tag && $trk_name ) - { - $is_alphabetical = ( strtolower($chr) != strtoupper($chr) || in_array($chr, array('0', '1', '2', '3', '4', '5', '6', '7', '8', '9')) || $chr == '?' || $chr == '!' || $chr == '-' ); - if ( $is_alphabetical ) - $tag_name .= $chr; - else - { - $trk_name = false; - } - } - - } - - // Vulnerability from ha.ckers.org/xss.html: - // "; - // apply changes - $html = str_replace($jscript[0][$i], $replacement, $html); - - } - - // Re-insert untouchable tags - for ($i = 0;$i < sizeof($matches[1]); $i++) - { - $html = str_replace("{DONT_STRIP_ME_NAKED:$seed:$i}", "<{$matches[1][$i]}{$matches[2][$i]}>{$matches[3][$i]}", $html); - } - - // Which tags to strip - you can change this if needed - $strip_tags = Array('pre', 'script', 'style', 'enano:no-opt', 'textarea'); - $strip_tags = implode('|', $strip_tags); - - // Strip out the tags and replace with placeholders - preg_match_all("#<($strip_tags)(.*?)>(.*?)#is", $html, $matches); - $seed = md5(microtime() . mt_rand()); // Random value used for placeholders - for ($i = 0;$i < sizeof($matches[1]); $i++) - { - $html = str_replace($matches[0][$i], "{DONT_STRIP_ME_NAKED:$seed:$i}", $html); - } - - // Finally, process the HTML - $html = preg_replace("#\n([ ]*)#", " ", $html); - - // Remove annoying spaces between tags - $html = preg_replace("#>([ ][ ]+)<#", "> <", $html); - - // Re-insert untouchable tags - for ($i = 0;$i < sizeof($matches[1]); $i++) - { - $html = str_replace("{DONT_STRIP_ME_NAKED:$seed:$i}", "<{$matches[1][$i]}{$matches[2][$i]}>{$matches[3][$i]}", $html); - } - - // Remove blocks (can be used by themes that don't want their HTML optimized) - $html = preg_replace('#<(\/|)enano:no-opt(.*?)>#', '', $html); - - $size_after = strlen($html); - - // Tell snoopish users what's going on - $html = str_replace('\n(.*?)#is", $html, $matches); + $seed = md5(microtime() . mt_rand()); // Random value used for placeholders + for ($i = 0;$i < sizeof($matches[1]); $i++) + { + $html = str_replace($matches[0][$i], "{DONT_STRIP_ME_NAKED:$seed:$i}", $html); + } + + // Optimize (but don't obfuscate) Javascript + preg_match_all('/(.*?)(\]\]>)?<\/script>/is', $html, $jscript); + require_once(ENANO_ROOT . '/includes/js-compressor.php'); + $jsc = new JavascriptCompressor(); + + // list of Javascript reserved words - from about.com + $reserved_words = array('abstract', 'as', 'boolean', 'break', 'byte', 'case', 'catch', 'char', 'class', 'continue', 'const', 'debugger', 'default', 'delete', 'do', + 'double', 'else', 'enum', 'export', 'extends', 'false', 'final', 'finally', 'float', 'for', 'function', 'goto', 'if', 'implements', 'import', + 'in', 'instanceof', 'int', 'interface', 'is', 'long', 'namespace', 'native', 'new', 'null', 'package', 'private', 'protected', 'public', + 'return', 'short', 'static', 'super', 'switch', 'synchronized', 'this', 'throw', 'throws', 'transient', 'true', 'try', 'typeof', 'use', 'var', + 'void', 'volatile', 'while', 'with'); + + $reserved_words = '(' . implode('|', $reserved_words) . ')'; + + for ( $i = 0; $i < count($jscript[0]); $i++ ) + { + $js =& $jscript[2][$i]; + if ( empty($js) ) + continue; + + $js = $jsc->getClean($js); + + $replacement = "/* */"; + // apply changes + $html = str_replace($jscript[0][$i], $replacement, $html); + + } + + // Re-insert untouchable tags + for ($i = 0;$i < sizeof($matches[1]); $i++) + { + $html = str_replace("{DONT_STRIP_ME_NAKED:$seed:$i}", "<{$matches[1][$i]}{$matches[2][$i]}>{$matches[3][$i]}", $html); + } + + // Which tags to strip - you can change this if needed + $strip_tags = Array('pre', 'script', 'style', 'enano:no-opt', 'textarea'); + $strip_tags = implode('|', $strip_tags); + + // Strip out the tags and replace with placeholders + preg_match_all("#<($strip_tags)(.*?)>(.*?)#is", $html, $matches); + $seed = md5(microtime() . mt_rand()); // Random value used for placeholders + for ($i = 0;$i < sizeof($matches[1]); $i++) + { + $html = str_replace($matches[0][$i], "{DONT_STRIP_ME_NAKED:$seed:$i}", $html); + } + + // Finally, process the HTML + $html = preg_replace("#\n([ ]*)#", " ", $html); + + // Remove annoying spaces between tags + $html = preg_replace("#>([ ][ ]+)<#", "> <", $html); + + // Re-insert untouchable tags + for ($i = 0;$i < sizeof($matches[1]); $i++) + { + $html = str_replace("{DONT_STRIP_ME_NAKED:$seed:$i}", "<{$matches[1][$i]}{$matches[2][$i]}>{$matches[3][$i]}", $html); + } + + // Remove blocks (can be used by themes that don't want their HTML optimized) + $html = preg_replace('#<(\/|)enano:no-opt(.*?)>#', '', $html); + + $size_after = strlen($html); + + // Tell snoopish users what's going on + $html = str_replace('\n array(), 1 => array(), 2 => array(), 3 => array() ); - foreach ( $octets as $octet ) - { - $existing =& $possibilities[$i]; - $inner = explode('|', $octet); - foreach ( $inner as $bit ) - { - if ( $i >= 2 ) - { - $bits = int_range($bit); - if ( $bits === false ) - return false; - else if ( !is_array($bits) ) - $existing[] = intval($bits); - else - $existing = array_merge($existing, $bits); - } - else - { - $bit = intval($bit); - $existing[] = $bit; - } - } - $existing = array_unique($existing); - $i++; - } - $ips = array(); - - // The only way to combine all those possibilities. ;-) - foreach ( $possibilities[0] as $oc1 ) - foreach ( $possibilities[1] as $oc2 ) - foreach ( $possibilities[2] as $oc3 ) - foreach ( $possibilities[3] as $oc4 ) - $ips[] = "$oc1.$oc2.$oc3.$oc4"; - - return $ips; + $octets = explode('.', $range); + if ( count($octets) != 4 ) + // invalid range + return $range; + $i = 0; + $possibilities = array( 0 => array(), 1 => array(), 2 => array(), 3 => array() ); + foreach ( $octets as $octet ) + { + $existing =& $possibilities[$i]; + $inner = explode('|', $octet); + foreach ( $inner as $bit ) + { + if ( $i >= 2 ) + { + $bits = int_range($bit); + if ( $bits === false ) + return false; + else if ( !is_array($bits) ) + $existing[] = intval($bits); + else + $existing = array_merge($existing, $bits); + } + else + { + $bit = intval($bit); + $existing[] = $bit; + } + } + $existing = array_unique($existing); + $i++; + } + $ips = array(); + + // The only way to combine all those possibilities. ;-) + foreach ( $possibilities[0] as $oc1 ) + foreach ( $possibilities[1] as $oc2 ) + foreach ( $possibilities[2] as $oc3 ) + foreach ( $possibilities[3] as $oc4 ) + $ips[] = "$oc1.$oc2.$oc3.$oc4"; + + return $ips; } /** @@ -3428,14 +3428,14 @@ function parse_ip_range_regex($range) { - if ( strstr($range, ':') ) - { - return parse_ipv6_range_regex($range); - } - else - { - return parse_ipv4_range_regex($range); - } + if ( strstr($range, ':') ) + { + return parse_ipv6_range_regex($range); + } + else + { + return parse_ipv4_range_regex($range); + } } /** @@ -3446,62 +3446,62 @@ function parse_ipv4_range_regex($range) { - // Regular expression to test the range string for validity - $regex = '/^(([0-9]+(-[0-9]+)?)(\|([0-9]+(-[0-9]+)?))*)\.' - . '(([0-9]+(-[0-9]+)?)(\|([0-9]+(-[0-9]+)?))*)\.' - . '(([0-9]+(-[0-9]+)?)(\|([0-9]+(-[0-9]+)?))*)\.' - . '(([0-9]+(-[0-9]+)?)(\|([0-9]+(-[0-9]+)?))*)$/'; - if ( !preg_match($regex, $range) ) - { - return false; - } - $octets = array(0 => array(), 1 => array(), 2 => array(), 3 => array()); - list($octets[0], $octets[1], $octets[2], $octets[3]) = explode('.', $range); - $return = '^'; - foreach ( $octets as $octet ) - { - // alternatives array - $alts = array(); - if ( strpos($octet, '|') ) - { - $particles = explode('|', $octet); - } - else - { - $particles = array($octet); - } - foreach ( $particles as $atom ) - { - // each $atom will be either - if ( strval(intval($atom)) == $atom ) - { - $alts[] = $atom; - continue; - } - else - { - // it's a range - parse it out - $alt2 = int_range($atom); - if ( !$alt2 ) - return false; - foreach ( $alt2 as $neutrino ) - $alts[] = $neutrino; - } - } - $alts = array_unique($alts); - $alts = '|' . implode('|', $alts) . '|'; - // we can further optimize/compress this by weaseling our way into using some character ranges - for ( $i = 1; $i <= 25; $i++ ) - { - $alts = str_replace("|{$i}0|{$i}1|{$i}2|{$i}3|{$i}4|{$i}5|{$i}6|{$i}7|{$i}8|{$i}9|", "|{$i}[0-9]|", $alts); - } - $alts = str_replace("|1|2|3|4|5|6|7|8|9|", "|[1-9]|", $alts); - $alts = '(' . substr($alts, 1, -1) . ')'; - $return .= $alts . '\.'; - } - $return = substr($return, 0, -2); - $return .= '$'; - return $return; + // Regular expression to test the range string for validity + $regex = '/^(([0-9]+(-[0-9]+)?)(\|([0-9]+(-[0-9]+)?))*)\.' + . '(([0-9]+(-[0-9]+)?)(\|([0-9]+(-[0-9]+)?))*)\.' + . '(([0-9]+(-[0-9]+)?)(\|([0-9]+(-[0-9]+)?))*)\.' + . '(([0-9]+(-[0-9]+)?)(\|([0-9]+(-[0-9]+)?))*)$/'; + if ( !preg_match($regex, $range) ) + { + return false; + } + $octets = array(0 => array(), 1 => array(), 2 => array(), 3 => array()); + list($octets[0], $octets[1], $octets[2], $octets[3]) = explode('.', $range); + $return = '^'; + foreach ( $octets as $octet ) + { + // alternatives array + $alts = array(); + if ( strpos($octet, '|') ) + { + $particles = explode('|', $octet); + } + else + { + $particles = array($octet); + } + foreach ( $particles as $atom ) + { + // each $atom will be either + if ( strval(intval($atom)) == $atom ) + { + $alts[] = $atom; + continue; + } + else + { + // it's a range - parse it out + $alt2 = int_range($atom); + if ( !$alt2 ) + return false; + foreach ( $alt2 as $neutrino ) + $alts[] = $neutrino; + } + } + $alts = array_unique($alts); + $alts = '|' . implode('|', $alts) . '|'; + // we can further optimize/compress this by weaseling our way into using some character ranges + for ( $i = 1; $i <= 25; $i++ ) + { + $alts = str_replace("|{$i}0|{$i}1|{$i}2|{$i}3|{$i}4|{$i}5|{$i}6|{$i}7|{$i}8|{$i}9|", "|{$i}[0-9]|", $alts); + } + $alts = str_replace("|1|2|3|4|5|6|7|8|9|", "|[1-9]|", $alts); + $alts = '(' . substr($alts, 1, -1) . ')'; + $return .= $alts . '\.'; + } + $return = substr($return, 0, -2); + $return .= '$'; + return $return; } /** @@ -3512,89 +3512,89 @@ function parse_ipv6_range_regex($range) { - $range = strtolower(trim($range)); - $valid = '/^'; - $valid .= '(?:[0-9a-f]{0,4}|[0-9a-f]{1,4}-[0-9a-f]{1,4}):'; - $valid .= '(?:[0-9a-f]{0,4}|[0-9a-f]{1,4}-[0-9a-f]{1,4}):'; - $valid .= '(?:[0-9a-f]{0,4}|[0-9a-f]{1,4}-[0-9a-f]{1,4}:|:)?'; - $valid .= '(?:[0-9a-f]{0,4}|[0-9a-f]{1,4}-[0-9a-f]{1,4}:|:)?'; - $valid .= '(?:[0-9a-f]{0,4}|[0-9a-f]{1,4}-[0-9a-f]{1,4}:|:)?'; - $valid .= '(?:[0-9a-f]{0,4}|[0-9a-f]{1,4}-[0-9a-f]{1,4}:|:)?'; - $valid .= '(?:[0-9a-f]{0,4}|[0-9a-f]{1,4}-[0-9a-f]{1,4}:|:)?'; - $valid .= '(?:[0-9a-f]{0,4}|[0-9a-f]{1,4}-[0-9a-f]{1,4})$/'; - if ( !preg_match($valid, $range) ) - return false; - - // expand address range. - // this takes short ranges like: - // 2001:470-471:054-b02b::5-bb - // up to: - // 2001:0470-0471:0054-b02b:0000:0000:0000:0005-00bb - $range = preg_replace('/^:/', '0000:', $range); - $range = explode(':', $range); - $expanded = ''; - $size = count($range); - foreach ( $range as $byteset ) - { - if ( empty($byteset) ) - { - // :: - while ( $size < 9 ) - { - $expanded .= '0000:'; - $size++; - } - } - else - { - if ( strstr($byteset, '-') ) - { - // this is a range - $sides = explode('-', $byteset); - foreach ( $sides as &$bytepair ) - { - while ( strlen($bytepair) < 4 ) - { - $bytepair = "0$bytepair"; - } - } - $byteset = implode('-', $sides); - } - else - { - while ( strlen($byteset) < 4 ) - { - $byteset = "0$byteset"; - } - } - $expanded .= "$byteset:"; - } - } - $expanded = explode(':', rtrim($expanded, ':')); - - // ready to dive in and start generating range regexes. - // this has to be pretty optimized... we want to end up with regexes like: - // range: 54-b12b - /* - /005[4-9a-f]| - 00[6-9a-f][0-9a-f]| - 0[1-9a-f][0-9a-f][0-9a-f]| - [1-9a][0-9a-f][0-9a-f][0-9a-f]| - b[0-0][0-1][0-9a-f]| - b0[0-1][0-9a-f]| - b02[0-9a-b]/x - */ - foreach ( $expanded as &$word ) - { - if ( strstr($word, '-') ) - { - // oh... damn. - $word = '(?:' . generate_hex_numeral_range($word) . ')'; - } - } - - // return print_r($expanded, true); - return '^' . implode(':', $expanded) . '$'; + $range = strtolower(trim($range)); + $valid = '/^'; + $valid .= '(?:[0-9a-f]{0,4}|[0-9a-f]{1,4}-[0-9a-f]{1,4}):'; + $valid .= '(?:[0-9a-f]{0,4}|[0-9a-f]{1,4}-[0-9a-f]{1,4}):'; + $valid .= '(?:[0-9a-f]{0,4}|[0-9a-f]{1,4}-[0-9a-f]{1,4}:|:)?'; + $valid .= '(?:[0-9a-f]{0,4}|[0-9a-f]{1,4}-[0-9a-f]{1,4}:|:)?'; + $valid .= '(?:[0-9a-f]{0,4}|[0-9a-f]{1,4}-[0-9a-f]{1,4}:|:)?'; + $valid .= '(?:[0-9a-f]{0,4}|[0-9a-f]{1,4}-[0-9a-f]{1,4}:|:)?'; + $valid .= '(?:[0-9a-f]{0,4}|[0-9a-f]{1,4}-[0-9a-f]{1,4}:|:)?'; + $valid .= '(?:[0-9a-f]{0,4}|[0-9a-f]{1,4}-[0-9a-f]{1,4})$/'; + if ( !preg_match($valid, $range) ) + return false; + + // expand address range. + // this takes short ranges like: + // 2001:470-471:054-b02b::5-bb + // up to: + // 2001:0470-0471:0054-b02b:0000:0000:0000:0005-00bb + $range = preg_replace('/^:/', '0000:', $range); + $range = explode(':', $range); + $expanded = ''; + $size = count($range); + foreach ( $range as $byteset ) + { + if ( empty($byteset) ) + { + // :: + while ( $size < 9 ) + { + $expanded .= '0000:'; + $size++; + } + } + else + { + if ( strstr($byteset, '-') ) + { + // this is a range + $sides = explode('-', $byteset); + foreach ( $sides as &$bytepair ) + { + while ( strlen($bytepair) < 4 ) + { + $bytepair = "0$bytepair"; + } + } + $byteset = implode('-', $sides); + } + else + { + while ( strlen($byteset) < 4 ) + { + $byteset = "0$byteset"; + } + } + $expanded .= "$byteset:"; + } + } + $expanded = explode(':', rtrim($expanded, ':')); + + // ready to dive in and start generating range regexes. + // this has to be pretty optimized... we want to end up with regexes like: + // range: 54-b12b + /* + /005[4-9a-f]| + 00[6-9a-f][0-9a-f]| + 0[1-9a-f][0-9a-f][0-9a-f]| + [1-9a][0-9a-f][0-9a-f][0-9a-f]| + b[0-0][0-1][0-9a-f]| + b0[0-1][0-9a-f]| + b02[0-9a-b]/x + */ + foreach ( $expanded as &$word ) + { + if ( strstr($word, '-') ) + { + // oh... damn. + $word = '(?:' . generate_hex_numeral_range($word) . ')'; + } + } + + // return print_r($expanded, true); + return '^' . implode(':', $expanded) . '$'; } /** @@ -3606,152 +3606,152 @@ function generate_hex_numeral_range($word) { - list($low, $high) = explode('-', $word); - - if ( hexdec($low) > hexdec($high) ) - { - $_ = $low; - $low = $high; - $high = $_; - unset($_); - } - - while ( strlen($low) < strlen($high) ) - { - $low = "0$low"; - } - - // trim off everything that's the same - $trimmed = ''; - $len = strlen($low); - for ( $i = 0; $i < $len; $i++ ) - { - if ( $low{0} === $high{0} ) - { - $trimmed .= $low{0}; - $low = substr($low, 1); - $high = substr($high, 1); - } - else - { - break; - } - } - - $len = strlen($high); - if ( $len == 1 ) - { - // this does happen sometimes, so we can save a bit of CPU power here. - return $trimmed . __hexdigitrange($low, $high); - } - - $return = ''; - // lower half - for ( $i = $len - 1; $i > 0; $i-- ) - { - if ( $low{$i} == 'f' ) - continue; - $return .= $trimmed; - for ( $j = 0; $j < $len; $j++ ) - { - if ( $j < $i ) - { - $return .= $low{$j}; - } - else if ( $j == $i && ( $i == $len - 1 || $low{$j} == 'f' ) ) - { - $return .= __hexdigitrange($low{$j}, 'f'); - } - else if ( $j == $i && $i != $len - 1 ) - { - $return .= __hexdigitrange(dechex(hexdec($low{$j}) + 1), 'f'); - } - else - { - $return .= __hexdigitrange('0', 'f'); - } - } - $return .= '|'; - } - // middle block - if ( hexdec($low{0}) + 1 < hexdec($high{0}) ) - { - if ( hexdec($low{0}) + 1 < hexdec($high{0}) - 1 ) - $return .= $trimmed . __hexdigitrange(dechex(hexdec($low{0}) + 1), dechex(hexdec($high{0}) - 1)); - else - $return .= $trimmed . __hexdigitrange($low{0}, $high{0}); - if ( $len - 1 > 0 ) - $return .= '[0-9a-f]{' . ( $len - 1 ) . '}|'; - } - // higher half - for ( $i = 1; $i < $len; $i++ ) - { - if ( $high{$i} == '0' ) - continue; - $return .= $trimmed; - for ( $j = 0; $j < $len; $j++ ) - { - if ( $j < $i ) - { - $return .= $high{$j}; - } - else if ( $j == $i && ( $i == $len - 1 || $high{$j} == '0' ) ) - { - $return .= __hexdigitrange('0', $high{$j}); - } - else if ( $j == $i && $i != $len - 1 ) - { - $return .= __hexdigitrange('0', dechex(hexdec($high{$j}) - 1)); - } - else if ( $j > $i ) - { - $return .= __hexdigitrange('0', 'f'); - } - else - { - die("I don't know what to do! i $i j $j"); - } - } - $return .= '|'; - } - - return rtrim($return, '|'); + list($low, $high) = explode('-', $word); + + if ( hexdec($low) > hexdec($high) ) + { + $_ = $low; + $low = $high; + $high = $_; + unset($_); + } + + while ( strlen($low) < strlen($high) ) + { + $low = "0$low"; + } + + // trim off everything that's the same + $trimmed = ''; + $len = strlen($low); + for ( $i = 0; $i < $len; $i++ ) + { + if ( $low{0} === $high{0} ) + { + $trimmed .= $low{0}; + $low = substr($low, 1); + $high = substr($high, 1); + } + else + { + break; + } + } + + $len = strlen($high); + if ( $len == 1 ) + { + // this does happen sometimes, so we can save a bit of CPU power here. + return $trimmed . __hexdigitrange($low, $high); + } + + $return = ''; + // lower half + for ( $i = $len - 1; $i > 0; $i-- ) + { + if ( $low{$i} == 'f' ) + continue; + $return .= $trimmed; + for ( $j = 0; $j < $len; $j++ ) + { + if ( $j < $i ) + { + $return .= $low{$j}; + } + else if ( $j == $i && ( $i == $len - 1 || $low{$j} == 'f' ) ) + { + $return .= __hexdigitrange($low{$j}, 'f'); + } + else if ( $j == $i && $i != $len - 1 ) + { + $return .= __hexdigitrange(dechex(hexdec($low{$j}) + 1), 'f'); + } + else + { + $return .= __hexdigitrange('0', 'f'); + } + } + $return .= '|'; + } + // middle block + if ( hexdec($low{0}) + 1 < hexdec($high{0}) ) + { + if ( hexdec($low{0}) + 1 < hexdec($high{0}) - 1 ) + $return .= $trimmed . __hexdigitrange(dechex(hexdec($low{0}) + 1), dechex(hexdec($high{0}) - 1)); + else + $return .= $trimmed . __hexdigitrange($low{0}, $high{0}); + if ( $len - 1 > 0 ) + $return .= '[0-9a-f]{' . ( $len - 1 ) . '}|'; + } + // higher half + for ( $i = 1; $i < $len; $i++ ) + { + if ( $high{$i} == '0' ) + continue; + $return .= $trimmed; + for ( $j = 0; $j < $len; $j++ ) + { + if ( $j < $i ) + { + $return .= $high{$j}; + } + else if ( $j == $i && ( $i == $len - 1 || $high{$j} == '0' ) ) + { + $return .= __hexdigitrange('0', $high{$j}); + } + else if ( $j == $i && $i != $len - 1 ) + { + $return .= __hexdigitrange('0', dechex(hexdec($high{$j}) - 1)); + } + else if ( $j > $i ) + { + $return .= __hexdigitrange('0', 'f'); + } + else + { + die("I don't know what to do! i $i j $j"); + } + } + $return .= '|'; + } + + return rtrim($return, '|'); } function __hexdigitrange($low, $high) { - if ( $low == $high ) - return $low; - if ( empty($low) ) - $low = '0'; - - $low_type = ( preg_match('/[0-9]/', $low) ) ? 'num' : 'alph'; - $high_type = ( preg_match('/[0-9]/', $high) ) ? 'num' : 'alph'; - if ( ( $low_type == 'num' && $high_type == 'num') || ( $low_type == 'alph' && $high_type == 'alph' ) ) - { - return "[$low-$high]"; - } - else if ( $low_type == 'num' && $high_type == 'alph' ) - { - $ret = '['; - - if ( $low == '9' ) - $ret .= '9'; - else - $ret .= "$low-9"; - if ( $high == 'a' ) - $ret .= 'a'; - else - $ret .= "a-$high"; - - $ret .= "]"; - return $ret; - } - else if ( $low_type == 'alph' && $high_type == 'num' ) - { - // ???? this should never happen - return __hexdigitrange($high, $low); - } + if ( $low == $high ) + return $low; + if ( empty($low) ) + $low = '0'; + + $low_type = ( preg_match('/[0-9]/', $low) ) ? 'num' : 'alph'; + $high_type = ( preg_match('/[0-9]/', $high) ) ? 'num' : 'alph'; + if ( ( $low_type == 'num' && $high_type == 'num') || ( $low_type == 'alph' && $high_type == 'alph' ) ) + { + return "[$low-$high]"; + } + else if ( $low_type == 'num' && $high_type == 'alph' ) + { + $ret = '['; + + if ( $low == '9' ) + $ret .= '9'; + else + $ret .= "$low-9"; + if ( $high == 'a' ) + $ret .= 'a'; + else + $ret .= "a-$high"; + + $ret .= "]"; + return $ret; + } + else if ( $low_type == 'alph' && $high_type == 'num' ) + { + // ???? this should never happen + return __hexdigitrange($high, $low); + } } /** @@ -3762,26 +3762,26 @@ function expand_ipv6_address($addr) { - $expanded = array(); - $addr = explode(':', $addr); - foreach ( $addr as $i => $bytepair ) - { - if ( empty($bytepair) ) - { - // :: - while ( count($expanded) < (8 - count($addr) + $i + 1) ) - { - $expanded[] = '0000'; - } - } - else - { - while ( strlen($bytepair) < 4 ) - $bytepair = "0$bytepair"; - $expanded[] = $bytepair; - } - } - return implode(':', $expanded); + $expanded = array(); + $addr = explode(':', $addr); + foreach ( $addr as $i => $bytepair ) + { + if ( empty($bytepair) ) + { + // :: + while ( count($expanded) < (8 - count($addr) + $i + 1) ) + { + $expanded[] = '0000'; + } + } + else + { + while ( strlen($bytepair) < 4 ) + $bytepair = "0$bytepair"; + $expanded[] = $bytepair; + } + } + return implode(':', $expanded); } /** @@ -3792,19 +3792,19 @@ function check_email_address($email) { - static $regexp = '(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|"[^\\\x80-\xff\n\015"]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015"]*)*")[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:\.[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|"[^\\\x80-\xff\n\015"]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015"]*)*")[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*)*@[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\])[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:\.[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\])[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*)*|(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|"[^\\\x80-\xff\n\015"]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015"]*)*")[^()<>@,;:".\\\[\]\x80-\xff\000-\010\012-\037]*(?:(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)|"[^\\\x80-\xff\n\015"]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015"]*)*")[^()<>@,;:".\\\[\]\x80-\xff\000-\010\012-\037]*)*<[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:@[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\])[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:\.[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\])[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*)*(?:,[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*@[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\])[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:\.[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\])[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*)*)*:[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*)?(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|"[^\\\x80-\xff\n\015"]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015"]*)*")[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:\.[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|"[^\\\x80-\xff\n\015"]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015"]*)*")[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*)*@[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\])[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:\.[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\])[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*)*>)'; - return ( preg_match("/^$regexp$/", $email) ) ? true : false; + static $regexp = '(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|"[^\\\x80-\xff\n\015"]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015"]*)*")[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:\.[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|"[^\\\x80-\xff\n\015"]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015"]*)*")[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*)*@[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\])[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:\.[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\])[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*)*|(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|"[^\\\x80-\xff\n\015"]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015"]*)*")[^()<>@,;:".\\\[\]\x80-\xff\000-\010\012-\037]*(?:(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)|"[^\\\x80-\xff\n\015"]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015"]*)*")[^()<>@,;:".\\\[\]\x80-\xff\000-\010\012-\037]*)*<[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:@[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\])[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:\.[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\])[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*)*(?:,[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*@[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\])[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:\.[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\])[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*)*)*:[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*)?(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|"[^\\\x80-\xff\n\015"]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015"]*)*")[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:\.[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|"[^\\\x80-\xff\n\015"]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015"]*)*")[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*)*@[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\])[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:\.[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\])[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*)*>)'; + return ( preg_match("/^$regexp$/", $email) ) ? true : false; } function password_score_len($password) { - if ( !is_string($password) ) - { - return -10; - } - $len = strlen($password); - $score = $len - 7; - return $score; + if ( !is_string($password) ) + { + return -10; + } + $len = strlen($password); + $score = $len - 7; + return $score; } /** @@ -3818,159 +3818,159 @@ function password_score($password, &$debug = false) { - if ( !is_string($password) ) - { - return -10; - } - $score = 0; - $debug = array(); - // length check - $lenscore = password_score_len($password); - - $debug[] = "How this score was calculated\nYour score was tallied up based on an extensive algorithm which outputted\nthe following scores based on traits of your password. Above you can see the\ncomposite score; your individual scores based on certain tests are below.\n\nThe scale is open-ended, with a minimum score of -10. 10 is very strong, 4\nis strong, 1 is good and -3 is fair. Below -3 scores \"Weak.\"\n"; - - $debug[] = 'Adding '.$lenscore.' points for length'; - - $score += $lenscore; - - $has_upper_lower = false; - $has_symbols = false; - $has_numbers = false; - - // contains uppercase and lowercase - if ( preg_match('/[A-z]+/', $password) && strtolower($password) != $password ) - { - $score += 1; - $has_upper_lower = true; - $debug[] = 'Adding 1 point for having uppercase and lowercase'; - } - - // contains symbols - if ( preg_match('/[^A-z0-9]+/', $password) ) - { - $score += 1; - $has_symbols = true; - $debug[] = 'Adding 1 point for having nonalphanumeric characters (matching /[^A-z0-9]+/)'; - } - - // contains numbers - if ( preg_match('/[0-9]+/', $password) ) - { - $score += 1; - $has_numbers = true; - $debug[] = 'Adding 1 point for having numbers'; - } - - if ( $has_upper_lower && $has_symbols && $has_numbers && strlen($password) >= 9 ) - { - // if it has uppercase and lowercase letters, symbols, and numbers, and is of considerable length, add some serious points - $score += 4; - $debug[] = 'Adding 4 points for having uppercase and lowercase, numbers, and nonalphanumeric and being more than 8 characters'; - } - else if ( $has_upper_lower && $has_symbols && $has_numbers ) - { - // still give some points for passing complexity check - $score += 2; - $debug[] = 'Adding 2 points for having uppercase and lowercase, numbers, and nonalphanumeric'; - } - else if ( ( $has_upper_lower && $has_symbols ) || - ( $has_upper_lower && $has_numbers ) || - ( $has_symbols && $has_numbers ) ) - { - // if 2 of the three main complexity checks passed, add a point - $score += 1; - $debug[] = 'Adding 1 point for having 2 of 3 complexity checks'; - } - else if ( preg_match('/^[0-9]*?([a-z]+)[0-9]?$/', $password) ) - { - // password is something like magnum1 which will be cracked in seconds - $score += -4; - $debug[] = 'Adding -4 points for being of the form [number][word][number]'; - } - else if ( ( !$has_upper_lower && !$has_numbers && $has_symbols ) || - ( !$has_upper_lower && !$has_symbols && $has_numbers ) || - ( !$has_numbers && !$has_symbols && $has_upper_lower ) ) - { - $score += -2; - $debug[] = 'Adding -2 points for only meeting 1 complexity check'; - } - else if ( !$has_upper_lower && !$has_numbers && !$has_symbols ) - { - $debug[] = 'Adding -3 points for not meeting any complexity checks'; - $score += -3; - } - - // - // Repetition - // Example: foobar12345 should be deducted points, where f1o2o3b4a5r should be given points - // - - if ( preg_match('/([A-Z][A-Z][A-Z][A-Z]|[a-z][a-z][a-z][a-z])/', $password) ) - { - $debug[] = 'Adding -2 points for having more than 4 letters of the same case in a row'; - $score += -2; - } - else if ( preg_match('/([A-Z][A-Z][A-Z]|[a-z][a-z][a-z])/', $password) ) - { - $debug[] = 'Adding -1 points for having more than 3 letters of the same case in a row'; - $score += -1; - } - else if ( preg_match('/[A-z]/', $password) && !preg_match('/([A-Z][A-Z][A-Z]|[a-z][a-z][a-z])/', $password) ) - { - $debug[] = 'Adding 1 point for never having more than 2 letters of the same case in a row'; - $score += 1; - } - - if ( preg_match('/[0-9][0-9][0-9][0-9]/', $password) ) - { - $debug[] = 'Adding -2 points for having 4 or more numbers in a row'; - $score += -2; - } - else if ( preg_match('/[0-9][0-9][0-9]/', $password) ) - { - $debug[] = 'Adding -1 points for having 3 or more numbers in a row'; - $score += -1; - } - else if ( $has_numbers && !preg_match('/[0-9][0-9][0-9]/', $password) ) - { - $debug[] = 'Adding 1 point for never more than 2 numbers in a row'; - $score += -1; - } - - // make passwords like fooooooooooooooooooooooooooooooooooooo totally die by subtracting a point for each character repeated at least 3 times in a row - $prev_char = ''; - $warn = false; - $loss = 0; - for ( $i = 0; $i < strlen($password); $i++ ) - { - $chr = $password{$i}; - if ( $chr == $prev_char && $warn ) - { - $loss += -1; - } - else if ( $chr == $prev_char && !$warn ) - { - $warn = true; - } - else if ( $chr != $prev_char && $warn ) - { - $warn = false; - } - $prev_char = $chr; - } - if ( $loss < 0 ) - { - $debug[] = 'Adding '.$loss.' points for immediate character repetition'; - $score += $loss; - // this can bring the score below -10 sometimes - if ( $score < -10 ) - { - $debug[] = 'Setting score to -10 because it went below ('.$score.')'; - $score = -10; - } - } - - return $score; + if ( !is_string($password) ) + { + return -10; + } + $score = 0; + $debug = array(); + // length check + $lenscore = password_score_len($password); + + $debug[] = "How this score was calculated\nYour score was tallied up based on an extensive algorithm which outputted\nthe following scores based on traits of your password. Above you can see the\ncomposite score; your individual scores based on certain tests are below.\n\nThe scale is open-ended, with a minimum score of -10. 10 is very strong, 4\nis strong, 1 is good and -3 is fair. Below -3 scores \"Weak.\"\n"; + + $debug[] = 'Adding '.$lenscore.' points for length'; + + $score += $lenscore; + + $has_upper_lower = false; + $has_symbols = false; + $has_numbers = false; + + // contains uppercase and lowercase + if ( preg_match('/[A-z]+/', $password) && strtolower($password) != $password ) + { + $score += 1; + $has_upper_lower = true; + $debug[] = 'Adding 1 point for having uppercase and lowercase'; + } + + // contains symbols + if ( preg_match('/[^A-z0-9]+/', $password) ) + { + $score += 1; + $has_symbols = true; + $debug[] = 'Adding 1 point for having nonalphanumeric characters (matching /[^A-z0-9]+/)'; + } + + // contains numbers + if ( preg_match('/[0-9]+/', $password) ) + { + $score += 1; + $has_numbers = true; + $debug[] = 'Adding 1 point for having numbers'; + } + + if ( $has_upper_lower && $has_symbols && $has_numbers && strlen($password) >= 9 ) + { + // if it has uppercase and lowercase letters, symbols, and numbers, and is of considerable length, add some serious points + $score += 4; + $debug[] = 'Adding 4 points for having uppercase and lowercase, numbers, and nonalphanumeric and being more than 8 characters'; + } + else if ( $has_upper_lower && $has_symbols && $has_numbers ) + { + // still give some points for passing complexity check + $score += 2; + $debug[] = 'Adding 2 points for having uppercase and lowercase, numbers, and nonalphanumeric'; + } + else if ( ( $has_upper_lower && $has_symbols ) || + ( $has_upper_lower && $has_numbers ) || + ( $has_symbols && $has_numbers ) ) + { + // if 2 of the three main complexity checks passed, add a point + $score += 1; + $debug[] = 'Adding 1 point for having 2 of 3 complexity checks'; + } + else if ( preg_match('/^[0-9]*?([a-z]+)[0-9]?$/', $password) ) + { + // password is something like magnum1 which will be cracked in seconds + $score += -4; + $debug[] = 'Adding -4 points for being of the form [number][word][number]'; + } + else if ( ( !$has_upper_lower && !$has_numbers && $has_symbols ) || + ( !$has_upper_lower && !$has_symbols && $has_numbers ) || + ( !$has_numbers && !$has_symbols && $has_upper_lower ) ) + { + $score += -2; + $debug[] = 'Adding -2 points for only meeting 1 complexity check'; + } + else if ( !$has_upper_lower && !$has_numbers && !$has_symbols ) + { + $debug[] = 'Adding -3 points for not meeting any complexity checks'; + $score += -3; + } + + // + // Repetition + // Example: foobar12345 should be deducted points, where f1o2o3b4a5r should be given points + // + + if ( preg_match('/([A-Z][A-Z][A-Z][A-Z]|[a-z][a-z][a-z][a-z])/', $password) ) + { + $debug[] = 'Adding -2 points for having more than 4 letters of the same case in a row'; + $score += -2; + } + else if ( preg_match('/([A-Z][A-Z][A-Z]|[a-z][a-z][a-z])/', $password) ) + { + $debug[] = 'Adding -1 points for having more than 3 letters of the same case in a row'; + $score += -1; + } + else if ( preg_match('/[A-z]/', $password) && !preg_match('/([A-Z][A-Z][A-Z]|[a-z][a-z][a-z])/', $password) ) + { + $debug[] = 'Adding 1 point for never having more than 2 letters of the same case in a row'; + $score += 1; + } + + if ( preg_match('/[0-9][0-9][0-9][0-9]/', $password) ) + { + $debug[] = 'Adding -2 points for having 4 or more numbers in a row'; + $score += -2; + } + else if ( preg_match('/[0-9][0-9][0-9]/', $password) ) + { + $debug[] = 'Adding -1 points for having 3 or more numbers in a row'; + $score += -1; + } + else if ( $has_numbers && !preg_match('/[0-9][0-9][0-9]/', $password) ) + { + $debug[] = 'Adding 1 point for never more than 2 numbers in a row'; + $score += -1; + } + + // make passwords like fooooooooooooooooooooooooooooooooooooo totally die by subtracting a point for each character repeated at least 3 times in a row + $prev_char = ''; + $warn = false; + $loss = 0; + for ( $i = 0; $i < strlen($password); $i++ ) + { + $chr = $password{$i}; + if ( $chr == $prev_char && $warn ) + { + $loss += -1; + } + else if ( $chr == $prev_char && !$warn ) + { + $warn = true; + } + else if ( $chr != $prev_char && $warn ) + { + $warn = false; + } + $prev_char = $chr; + } + if ( $loss < 0 ) + { + $debug[] = 'Adding '.$loss.' points for immediate character repetition'; + $score += $loss; + // this can bring the score below -10 sometimes + if ( $score < -10 ) + { + $debug[] = 'Setting score to -10 because it went below ('.$score.')'; + $score = -10; + } + } + + return $score; } /** @@ -3981,11 +3981,11 @@ function register_cron_task($func, $hour_interval = 24) { - global $cron_tasks; - $hour_interval = strval($hour_interval); - if ( !isset($cron_tasks[$hour_interval]) ) - $cron_tasks[$hour_interval] = array(); - $cron_tasks[$hour_interval][] = $func; + global $cron_tasks; + $hour_interval = strval($hour_interval); + if ( !isset($cron_tasks[$hour_interval]) ) + $cron_tasks[$hour_interval] = array(); + $cron_tasks[$hour_interval][] = $func; } /** @@ -3995,10 +3995,10 @@ function get_cron_next_run() { - global $cron_tasks; - $lowest_ivl = min(array_keys($cron_tasks)); - $last_run = intval(getConfig("cron_lastrun_ivl_$lowest_ivl")); - return intval($last_run + ( 3600 * $lowest_ivl )) - 30; + global $cron_tasks; + $lowest_ivl = min(array_keys($cron_tasks)); + $last_run = intval(getConfig("cron_lastrun_ivl_$lowest_ivl")); + return intval($last_run + ( 3600 * $lowest_ivl )) - 30; } /** @@ -4011,53 +4011,53 @@ function install_language($lang_code, $lang_name_neutral, $lang_name_local, $lang_file = false) { - global $db, $session, $paths, $template, $plugins; // Common objects - - $q = $db->sql_query('SELECT 1 FROM '.table_prefix.'language WHERE lang_code = \'' . $db->escape($lang_code) . '\';'); - if ( !$q ) - $db->_die('functions.php - checking for language existence'); - - if ( $db->numrows() > 0 ) - // Language already exists - return false; - - $q = $db->sql_query('INSERT INTO ' . table_prefix . 'language(lang_code, lang_name_default, lang_name_native) - VALUES( - \'' . $db->escape($lang_code) . '\', - \'' . $db->escape($lang_name_neutral) . '\', - \'' . $db->escape($lang_name_local) . '\' - );'); - if ( !$q ) - $db->_die('functions.php - installing language'); - - if ( ENANO_DBLAYER == 'PGSQL' ) - { - // exception for Postgres, which doesn't support insert IDs - // This will cause the Language class to just load by lang code - // instead of by numeric ID - $lang_id = $lang_code; - } - else - { - $lang_id = $db->insert_id(); - if ( empty($lang_id) || $lang_id == 0 ) - { - $db->_die('functions.php - invalid returned lang_id'); - } - } - - // Do we also need to install a language file? - if ( is_string($lang_file) && file_exists($lang_file) ) - { - $lang = new Language($lang_id); - $lang->import($lang_file); - } - else if ( is_string($lang_file) && !file_exists($lang_file) ) - { - echo 'Notice: Can\'t load language file, so the specified language wasn\'t fully installed.
'; - return false; - } - return true; + global $db, $session, $paths, $template, $plugins; // Common objects + + $q = $db->sql_query('SELECT 1 FROM '.table_prefix.'language WHERE lang_code = \'' . $db->escape($lang_code) . '\';'); + if ( !$q ) + $db->_die('functions.php - checking for language existence'); + + if ( $db->numrows() > 0 ) + // Language already exists + return false; + + $q = $db->sql_query('INSERT INTO ' . table_prefix . 'language(lang_code, lang_name_default, lang_name_native) + VALUES( + \'' . $db->escape($lang_code) . '\', + \'' . $db->escape($lang_name_neutral) . '\', + \'' . $db->escape($lang_name_local) . '\' + );'); + if ( !$q ) + $db->_die('functions.php - installing language'); + + if ( ENANO_DBLAYER == 'PGSQL' ) + { + // exception for Postgres, which doesn't support insert IDs + // This will cause the Language class to just load by lang code + // instead of by numeric ID + $lang_id = $lang_code; + } + else + { + $lang_id = $db->insert_id(); + if ( empty($lang_id) || $lang_id == 0 ) + { + $db->_die('functions.php - invalid returned lang_id'); + } + } + + // Do we also need to install a language file? + if ( is_string($lang_file) && file_exists($lang_file) ) + { + $lang = new Language($lang_id); + $lang->import($lang_file); + } + else if ( is_string($lang_file) && !file_exists($lang_file) ) + { + echo 'Notice: Can\'t load language file, so the specified language wasn\'t fully installed.
'; + return false; + } + return true; } /** @@ -4067,43 +4067,43 @@ function list_available_languages() { - // Pulled from install/includes/common.php - - // Build a list of available languages - $dir = @opendir( ENANO_ROOT . '/language' ); - if ( !$dir ) - die('CRITICAL: could not open language directory'); - - $languages = array(); - - while ( $dh = @readdir($dir) ) - { - if ( $dh == '.' || $dh == '..' ) - continue; - if ( file_exists( ENANO_ROOT . "/language/$dh/meta.json" ) ) - { - // Found a language directory, determine metadata - $meta = @file_get_contents( ENANO_ROOT . "/language/$dh/meta.json" ); - if ( empty($meta) ) - // Could not read metadata file, continue silently - continue; - - // Do some syntax correction on the metadata - $meta = enano_clean_json($meta); - - $meta = enano_json_decode($meta); - if ( isset($meta['lang_name_english']) && isset($meta['lang_name_native']) && isset($meta['lang_code']) ) - { - $languages[$meta['lang_code']] = array( - 'name' => $meta['lang_name_native'], - 'name_eng' => $meta['lang_name_english'], - 'dir' => $dh - ); - } - } - } - - return $languages; + // Pulled from install/includes/common.php + + // Build a list of available languages + $dir = @opendir( ENANO_ROOT . '/language' ); + if ( !$dir ) + die('CRITICAL: could not open language directory'); + + $languages = array(); + + while ( $dh = @readdir($dir) ) + { + if ( $dh == '.' || $dh == '..' ) + continue; + if ( file_exists( ENANO_ROOT . "/language/$dh/meta.json" ) ) + { + // Found a language directory, determine metadata + $meta = @file_get_contents( ENANO_ROOT . "/language/$dh/meta.json" ); + if ( empty($meta) ) + // Could not read metadata file, continue silently + continue; + + // Do some syntax correction on the metadata + $meta = enano_clean_json($meta); + + $meta = enano_json_decode($meta); + if ( isset($meta['lang_name_english']) && isset($meta['lang_name_native']) && isset($meta['lang_code']) ) + { + $languages[$meta['lang_code']] = array( + 'name' => $meta['lang_name_native'], + 'name_eng' => $meta['lang_name_english'], + 'dir' => $dh + ); + } + } + } + + return $languages; } /** @@ -4120,154 +4120,154 @@ function scale_image($in_file, $out_file, $width = 225, $height = 225, $unlink = false) { - global $db, $session, $paths, $template, $plugins; // Common objects - - if ( !is_int($width) || !is_int($height) ) - throw new Exception('Invalid height or width.'); - - if ( !file_exists($in_file) ) - throw new Exception('Input file does not exist'); - - $in_file_sh = escapeshellarg($in_file); - $out_file_sh = escapeshellarg($out_file); - - if ( file_exists($out_file) && !$unlink ) - throw new Exception('Refusing to write output file as it already exists and $unlink was not specified.'); - else if ( file_exists($out_file) && $unlink ) - @unlink($out_file); - if ( file_exists($out_file) ) - // couldn't unlink (delete) the output file - throw new Exception('Failed to delete existing output file.'); - - $file_ext = strtolower(substr($in_file, ( strrpos($in_file, '.') + 1))); - switch($file_ext) - { - case 'png': - $func = 'imagecreatefrompng'; - break; - case 'jpg': - case 'jpeg': - $func = 'imagecreatefromjpeg'; - break; - case 'gif': - $func = 'imagecreatefromgif'; - break; - case 'xpm': - $func = 'imagecreatefromxpm'; - break; - default: - throw new Exception('Invalid extension of input file.'); - } - - $magick_path = getConfig('imagemagick_path'); - $can_use_magick = ( - getConfig('enable_imagemagick') == '1' && - file_exists($magick_path) && - is_executable($magick_path) - ); - $can_use_gd = ( - function_exists('getimagesize') && - function_exists('imagecreatetruecolor') && - function_exists('imagecopyresampled') && - function_exists($func) - ); - if ( $can_use_magick ) - { - if ( !preg_match('/^([\/A-z0-9:\. _-]+)$/', $magick_path) ) - { - die('SECURITY: ImageMagick path is screwy'); - } - $cmdline = "$magick_path $in_file_sh -resize \"{$width}x{$height}>\" $out_file_sh"; - system($cmdline, $return); - if ( !file_exists($out_file) ) - throw new Exception('ImageMagick: did not produce output image file.'); - return true; - } - else if ( $can_use_gd ) - { - @list($width_orig, $height_orig) = @getimagesize($in_file); - if ( !$width_orig || !$height_orig ) - throw new Exception('GD: Could not get height and width of input file.'); - // calculate new width and height - - $ratio = $width_orig / $height_orig; - if ( $ratio > 1 ) - { - // orig. width is greater that height - $new_width = $width; - $new_height = round( $width / $ratio ); - } - else if ( $ratio < 1 ) - { - // orig. height is greater than width - $new_width = round( $height / $ratio ); - $new_height = $height; - } - else if ( $ratio == 1 ) - { - $new_width = $width; - $new_height = $width; - } - if ( $new_width > $width_orig || $new_height > $height_orig ) - { - // Too big for our britches here; set it to only convert the file - $new_width = $width_orig; - $new_height = $height_orig; - } - - $newimage = @imagecreatetruecolor($new_width, $new_height); - if ( !$newimage ) - throw new Exception('GD: Request to create new truecolor image refused.'); - $oldimage = @$func($in_file); - if ( !$oldimage ) - throw new Exception('GD: Request to load input image file failed.'); - - // Perform scaling - imagecopyresampled($newimage, $oldimage, 0, 0, 0, 0, $new_width, $new_height, $width_orig, $height_orig); - - // Get output format - $out_ext = strtolower(substr($out_file, ( strrpos($out_file, '.') + 1))); - switch($out_ext) - { - case 'png': - $outfunc = 'imagepng'; - break; - case 'jpg': - case 'jpeg': - $outfunc = 'imagejpeg'; - break; - case 'gif': - $outfunc = 'imagegif'; - break; - case 'xpm': - $outfunc = 'imagexpm'; - break; - default: - imagedestroy($newimage); - imagedestroy($oldimage); - throw new Exception('GD: Invalid extension of output file.'); - } - - // Write output - $outfunc($newimage, $out_file); - - // clean up - imagedestroy($newimage); - imagedestroy($oldimage); - - // done! - return true; - } - // Neither scaling method worked; we'll let plugins try to scale it, and then if the file still doesn't exist, die - $code = $plugins->setHook('scale_image_failure'); - foreach ( $code as $cmd ) - { - eval($cmd); - } - if ( file_exists($out_file) ) - return true; - - throw new Exception('Failed to find an appropriate method for scaling.'); + global $db, $session, $paths, $template, $plugins; // Common objects + + if ( !is_int($width) || !is_int($height) ) + throw new Exception('Invalid height or width.'); + + if ( !file_exists($in_file) ) + throw new Exception('Input file does not exist'); + + $in_file_sh = escapeshellarg($in_file); + $out_file_sh = escapeshellarg($out_file); + + if ( file_exists($out_file) && !$unlink ) + throw new Exception('Refusing to write output file as it already exists and $unlink was not specified.'); + else if ( file_exists($out_file) && $unlink ) + @unlink($out_file); + if ( file_exists($out_file) ) + // couldn't unlink (delete) the output file + throw new Exception('Failed to delete existing output file.'); + + $file_ext = strtolower(substr($in_file, ( strrpos($in_file, '.') + 1))); + switch($file_ext) + { + case 'png': + $func = 'imagecreatefrompng'; + break; + case 'jpg': + case 'jpeg': + $func = 'imagecreatefromjpeg'; + break; + case 'gif': + $func = 'imagecreatefromgif'; + break; + case 'xpm': + $func = 'imagecreatefromxpm'; + break; + default: + throw new Exception('Invalid extension of input file.'); + } + + $magick_path = getConfig('imagemagick_path'); + $can_use_magick = ( + getConfig('enable_imagemagick') == '1' && + file_exists($magick_path) && + is_executable($magick_path) + ); + $can_use_gd = ( + function_exists('getimagesize') && + function_exists('imagecreatetruecolor') && + function_exists('imagecopyresampled') && + function_exists($func) + ); + if ( $can_use_magick ) + { + if ( !preg_match('/^([\/A-z0-9:\. _-]+)$/', $magick_path) ) + { + die('SECURITY: ImageMagick path is screwy'); + } + $cmdline = "$magick_path $in_file_sh -resize \"{$width}x{$height}>\" $out_file_sh"; + system($cmdline, $return); + if ( !file_exists($out_file) ) + throw new Exception('ImageMagick: did not produce output image file.'); + return true; + } + else if ( $can_use_gd ) + { + @list($width_orig, $height_orig) = @getimagesize($in_file); + if ( !$width_orig || !$height_orig ) + throw new Exception('GD: Could not get height and width of input file.'); + // calculate new width and height + + $ratio = $width_orig / $height_orig; + if ( $ratio > 1 ) + { + // orig. width is greater that height + $new_width = $width; + $new_height = round( $width / $ratio ); + } + else if ( $ratio < 1 ) + { + // orig. height is greater than width + $new_width = round( $height / $ratio ); + $new_height = $height; + } + else if ( $ratio == 1 ) + { + $new_width = $width; + $new_height = $width; + } + if ( $new_width > $width_orig || $new_height > $height_orig ) + { + // Too big for our britches here; set it to only convert the file + $new_width = $width_orig; + $new_height = $height_orig; + } + + $newimage = @imagecreatetruecolor($new_width, $new_height); + if ( !$newimage ) + throw new Exception('GD: Request to create new truecolor image refused.'); + $oldimage = @$func($in_file); + if ( !$oldimage ) + throw new Exception('GD: Request to load input image file failed.'); + + // Perform scaling + imagecopyresampled($newimage, $oldimage, 0, 0, 0, 0, $new_width, $new_height, $width_orig, $height_orig); + + // Get output format + $out_ext = strtolower(substr($out_file, ( strrpos($out_file, '.') + 1))); + switch($out_ext) + { + case 'png': + $outfunc = 'imagepng'; + break; + case 'jpg': + case 'jpeg': + $outfunc = 'imagejpeg'; + break; + case 'gif': + $outfunc = 'imagegif'; + break; + case 'xpm': + $outfunc = 'imagexpm'; + break; + default: + imagedestroy($newimage); + imagedestroy($oldimage); + throw new Exception('GD: Invalid extension of output file.'); + } + + // Write output + $outfunc($newimage, $out_file); + + // clean up + imagedestroy($newimage); + imagedestroy($oldimage); + + // done! + return true; + } + // Neither scaling method worked; we'll let plugins try to scale it, and then if the file still doesn't exist, die + $code = $plugins->setHook('scale_image_failure'); + foreach ( $code as $cmd ) + { + eval($cmd); + } + if ( file_exists($out_file) ) + return true; + + throw new Exception('Failed to find an appropriate method for scaling.'); } /** @@ -4280,39 +4280,39 @@ function is_gif_animated($filename) { - $filecontents = @file_get_contents($filename); - if ( empty($filecontents) ) - return false; - - $str_loc = 0; - $count = 0; - while ( $count < 2 ) // There is no point in continuing after we find a 2nd frame - { - $where1 = strpos($filecontents,"\x00\x21\xF9\x04", $str_loc); - if ( $where1 === false ) - { - break; - } - else - { - $str_loc = $where1 + 1; - $where2 = strpos($filecontents,"\x00\x2C", $str_loc); - if ( $where2 === false ) - { - break; - } - else - { - if ( $where1 + 8 == $where2 ) - { - $count++; - } - $str_loc = $where2 + 1; - } - } - } - - return ( $count > 1 ) ? true : false; + $filecontents = @file_get_contents($filename); + if ( empty($filecontents) ) + return false; + + $str_loc = 0; + $count = 0; + while ( $count < 2 ) // There is no point in continuing after we find a 2nd frame + { + $where1 = strpos($filecontents,"\x00\x21\xF9\x04", $str_loc); + if ( $where1 === false ) + { + break; + } + else + { + $str_loc = $where1 + 1; + $where2 = strpos($filecontents,"\x00\x2C", $str_loc); + if ( $where2 === false ) + { + break; + } + else + { + if ( $where1 + 8 == $where2 ) + { + $count++; + } + $str_loc = $where2 + 1; + } + } + } + + return ( $count > 1 ) ? true : false; } /** @@ -4323,17 +4323,17 @@ function gif_get_dimensions($filename) { - $filecontents = @file_get_contents($filename); - if ( empty($filecontents) ) - return false; - if ( strlen($filecontents) < 10 ) - return false; - - $width = substr($filecontents, 6, 2); - $height = substr($filecontents, 8, 2); - $width = unpack('v', $width); - $height = unpack('v', $height); - return array($width[1], $height[1]); + $filecontents = @file_get_contents($filename); + if ( empty($filecontents) ) + return false; + if ( strlen($filecontents) < 10 ) + return false; + + $width = substr($filecontents, 6, 2); + $height = substr($filecontents, 8, 2); + $width = unpack('v', $width); + $height = unpack('v', $height); + return array($width[1], $height[1]); } /** @@ -4344,19 +4344,19 @@ function is_png_animated($filename) { - $filecontents = @file_get_contents($filename); - if ( empty($filecontents) ) - return false; - - $parsed = parse_png($filecontents); - if ( !$parsed ) - return false; - - if ( !isset($parsed['fdAT']) ) - return false; - - if ( count($parsed['fdAT']) > 1 ) - return true; + $filecontents = @file_get_contents($filename); + if ( empty($filecontents) ) + return false; + + $parsed = parse_png($filecontents); + if ( !$parsed ) + return false; + + if ( !isset($parsed['fdAT']) ) + return false; + + if ( count($parsed['fdAT']) > 1 ) + return true; } /** @@ -4367,22 +4367,22 @@ function png_get_dimensions($filename) { - $filecontents = @file_get_contents($filename); - if ( empty($filecontents) ) - return false; - - $parsed = parse_png($filecontents); - if ( !$parsed ) - return false; - - $ihdr_stream = $parsed['IHDR'][0]; - $width = substr($ihdr_stream, 0, 4); - $height = substr($ihdr_stream, 4, 4); - $width = unpack('N', $width); - $height = unpack('N', $height); - $x = $width[1]; - $y = $height[1]; - return array($x, $y); + $filecontents = @file_get_contents($filename); + if ( empty($filecontents) ) + return false; + + $parsed = parse_png($filecontents); + if ( !$parsed ) + return false; + + $ihdr_stream = $parsed['IHDR'][0]; + $width = substr($ihdr_stream, 0, 4); + $height = substr($ihdr_stream, 4, 4); + $width = unpack('N', $width); + $height = unpack('N', $height); + $x = $width[1]; + $y = $height[1]; + return array($x, $y); } /** @@ -4393,37 +4393,37 @@ function parse_png($data) { - // Trim off first 8 bytes to check for PNG header - $header = substr($data, 0, 8); - if ( $header != "\x89\x50\x4e\x47\x0d\x0a\x1a\x0a" ) - { - return false; - } - $return = array(); - $data = substr($data, 8); - while ( strlen($data) > 0 ) - { - $chunklen_bin = substr($data, 0, 4); - $chunk_type = substr($data, 4, 4); - $chunklen = unpack('N', $chunklen_bin); - $chunklen = $chunklen[1]; - $chunk_data = substr($data, 8, $chunklen); - - // If the chunk type is not valid, this may be a malicious PNG with bad offsets. Break out of the loop. - if ( !preg_match('/^[A-z]{4}$/', $chunk_type) ) - break; - - if ( !isset($return[$chunk_type]) ) - $return[$chunk_type] = array(); - $return[$chunk_type][] = $chunk_data; - - $offset_next = 4 // Length - + 4 // Type - + $chunklen // Data - + 4; // CRC - $data = substr($data, $offset_next); - } - return $return; + // Trim off first 8 bytes to check for PNG header + $header = substr($data, 0, 8); + if ( $header != "\x89\x50\x4e\x47\x0d\x0a\x1a\x0a" ) + { + return false; + } + $return = array(); + $data = substr($data, 8); + while ( strlen($data) > 0 ) + { + $chunklen_bin = substr($data, 0, 4); + $chunk_type = substr($data, 4, 4); + $chunklen = unpack('N', $chunklen_bin); + $chunklen = $chunklen[1]; + $chunk_data = substr($data, 8, $chunklen); + + // If the chunk type is not valid, this may be a malicious PNG with bad offsets. Break out of the loop. + if ( !preg_match('/^[A-z]{4}$/', $chunk_type) ) + break; + + if ( !isset($return[$chunk_type]) ) + $return[$chunk_type] = array(); + $return[$chunk_type][] = $chunk_data; + + $offset_next = 4 // Length + + 4 // Type + + $chunklen // Data + + 4; // CRC + $data = substr($data, $offset_next); + } + return $return; } /** @@ -4436,51 +4436,51 @@ function get_jpeg_intrinsic_values( $jpeg_header_data ) { - // Create a blank array for the output - $Outputarray = array( ); - - //Cycle through the header segments until Start Of Frame (SOF) is found or we run out of segments - $i = 0; - while ( ( $i < count( $jpeg_header_data) ) && ( substr( $jpeg_header_data[$i]['SegName'], 0, 3 ) != "SOF" ) ) - { - $i++; - } - - // Check if a SOF segment has been found - if ( substr( $jpeg_header_data[$i]['SegName'], 0, 3 ) == "SOF" ) - { - // SOF segment was found, extract the information - - $data = $jpeg_header_data[$i]['SegData']; - - // First byte is Bits per component - $Outputarray['Bits per Component'] = ord( $data{0} ); - - // Second and third bytes are Image Height - $Outputarray['Image Height'] = ord( $data{ 1 } ) * 256 + ord( $data{ 2 } ); - - // Forth and fifth bytes are Image Width - $Outputarray['Image Width'] = ord( $data{ 3 } ) * 256 + ord( $data{ 4 } ); - - // Sixth byte is number of components - $numcomponents = ord( $data{ 5 } ); - - // Following this is a table containing information about the components - for( $i = 0; $i < $numcomponents; $i++ ) - { - $Outputarray['Components'][] = array ( 'Component Identifier' => ord( $data{ 6 + $i * 3 } ), - 'Horizontal Sampling Factor' => ( ord( $data{ 7 + $i * 3 } ) & 0xF0 ) / 16, - 'Vertical Sampling Factor' => ( ord( $data{ 7 + $i * 3 } ) & 0x0F ), - 'Quantization table destination selector' => ord( $data{ 8 + $i * 3 } ) ); - } - } - else - { - // Couldn't find Start Of Frame segment, hence can't retrieve info - return FALSE; - } - - return $Outputarray; + // Create a blank array for the output + $Outputarray = array( ); + + //Cycle through the header segments until Start Of Frame (SOF) is found or we run out of segments + $i = 0; + while ( ( $i < count( $jpeg_header_data) ) && ( substr( $jpeg_header_data[$i]['SegName'], 0, 3 ) != "SOF" ) ) + { + $i++; + } + + // Check if a SOF segment has been found + if ( substr( $jpeg_header_data[$i]['SegName'], 0, 3 ) == "SOF" ) + { + // SOF segment was found, extract the information + + $data = $jpeg_header_data[$i]['SegData']; + + // First byte is Bits per component + $Outputarray['Bits per Component'] = ord( $data{0} ); + + // Second and third bytes are Image Height + $Outputarray['Image Height'] = ord( $data{ 1 } ) * 256 + ord( $data{ 2 } ); + + // Forth and fifth bytes are Image Width + $Outputarray['Image Width'] = ord( $data{ 3 } ) * 256 + ord( $data{ 4 } ); + + // Sixth byte is number of components + $numcomponents = ord( $data{ 5 } ); + + // Following this is a table containing information about the components + for( $i = 0; $i < $numcomponents; $i++ ) + { + $Outputarray['Components'][] = array ( 'Component Identifier' => ord( $data{ 6 + $i * 3 } ), + 'Horizontal Sampling Factor' => ( ord( $data{ 7 + $i * 3 } ) & 0xF0 ) / 16, + 'Vertical Sampling Factor' => ( ord( $data{ 7 + $i * 3 } ) & 0x0F ), + 'Quantization table destination selector' => ord( $data{ 8 + $i * 3 } ) ); + } + } + else + { + // Couldn't find Start Of Frame segment, hence can't retrieve info + return FALSE; + } + + return $Outputarray; } /** @@ -4493,103 +4493,103 @@ function get_jpeg_header_data( $filename ) { - // Attempt to open the jpeg file - the at symbol supresses the error message about - // not being able to open files. The file_exists would have been used, but it - // does not work with files fetched over http or ftp. - $filehnd = @fopen($filename, 'rb'); - - // Check if the file opened successfully - if ( ! $filehnd ) - { - // Could't open the file - exit - return FALSE; - } - - - // Read the first two characters - $data = fread( $filehnd, 2 ); - - // Check that the first two characters are 0xFF 0xDA (SOI - Start of image) - if ( $data != "\xFF\xD8" ) - { - // No SOI (FF D8) at start of file - This probably isn't a JPEG file - close file and return; - fclose($filehnd); - return FALSE; - } - - - // Read the third character - $data = fread( $filehnd, 2 ); - - // Check that the third character is 0xFF (Start of first segment header) - if ( $data{0} != "\xFF" ) - { - // NO FF found - close file and return - JPEG is probably corrupted - fclose($filehnd); - return FALSE; - } - - // Flag that we havent yet hit the compressed image data - $hit_compressed_image_data = FALSE; - - - // Cycle through the file until, one of: 1) an EOI (End of image) marker is hit, - // 2) we have hit the compressed image data (no more headers are allowed after data) - // 3) or end of file is hit - - while ( ( $data{1} != "\xD9" ) && (! $hit_compressed_image_data) && ( ! feof( $filehnd ) )) - { - // Found a segment to look at. - // Check that the segment marker is not a Restart marker - restart markers don't have size or data after them - if ( ( ord($data{1}) < 0xD0 ) || ( ord($data{1}) > 0xD7 ) ) - { - // Segment isn't a Restart marker - // Read the next two bytes (size) - $sizestr = fread( $filehnd, 2 ); - - // convert the size bytes to an integer - $decodedsize = unpack ("nsize", $sizestr); - - // Save the start position of the data - $segdatastart = ftell( $filehnd ); - - // Read the segment data with length indicated by the previously read size - $segdata = fread( $filehnd, $decodedsize['size'] - 2 ); - - - // Store the segment information in the output array - $headerdata[] = array( "SegType" => ord($data{1}), - "SegName" => $GLOBALS[ "JPEG_Segment_Names" ][ ord($data{1}) ], - "SegDataStart" => $segdatastart, - "SegData" => $segdata ); - } - - // If this is a SOS (Start Of Scan) segment, then there is no more header data - the compressed image data follows - if ( $data{1} == "\xDA" ) - { - // Flag that we have hit the compressed image data - exit loop as no more headers available. - $hit_compressed_image_data = TRUE; - } - else - { - // Not an SOS - Read the next two bytes - should be the segment marker for the next segment - $data = fread( $filehnd, 2 ); - - // Check that the first byte of the two is 0xFF as it should be for a marker - if ( $data{0} != "\xFF" ) - { - // NO FF found - close file and return - JPEG is probably corrupted - fclose($filehnd); - return FALSE; - } - } - } - - // Close File - fclose($filehnd); - - // Return the header data retrieved - return $headerdata; + // Attempt to open the jpeg file - the at symbol supresses the error message about + // not being able to open files. The file_exists would have been used, but it + // does not work with files fetched over http or ftp. + $filehnd = @fopen($filename, 'rb'); + + // Check if the file opened successfully + if ( ! $filehnd ) + { + // Could't open the file - exit + return FALSE; + } + + + // Read the first two characters + $data = fread( $filehnd, 2 ); + + // Check that the first two characters are 0xFF 0xDA (SOI - Start of image) + if ( $data != "\xFF\xD8" ) + { + // No SOI (FF D8) at start of file - This probably isn't a JPEG file - close file and return; + fclose($filehnd); + return FALSE; + } + + + // Read the third character + $data = fread( $filehnd, 2 ); + + // Check that the third character is 0xFF (Start of first segment header) + if ( $data{0} != "\xFF" ) + { + // NO FF found - close file and return - JPEG is probably corrupted + fclose($filehnd); + return FALSE; + } + + // Flag that we havent yet hit the compressed image data + $hit_compressed_image_data = FALSE; + + + // Cycle through the file until, one of: 1) an EOI (End of image) marker is hit, + // 2) we have hit the compressed image data (no more headers are allowed after data) + // 3) or end of file is hit + + while ( ( $data{1} != "\xD9" ) && (! $hit_compressed_image_data) && ( ! feof( $filehnd ) )) + { + // Found a segment to look at. + // Check that the segment marker is not a Restart marker - restart markers don't have size or data after them + if ( ( ord($data{1}) < 0xD0 ) || ( ord($data{1}) > 0xD7 ) ) + { + // Segment isn't a Restart marker + // Read the next two bytes (size) + $sizestr = fread( $filehnd, 2 ); + + // convert the size bytes to an integer + $decodedsize = unpack ("nsize", $sizestr); + + // Save the start position of the data + $segdatastart = ftell( $filehnd ); + + // Read the segment data with length indicated by the previously read size + $segdata = fread( $filehnd, $decodedsize['size'] - 2 ); + + + // Store the segment information in the output array + $headerdata[] = array( "SegType" => ord($data{1}), + "SegName" => $GLOBALS[ "JPEG_Segment_Names" ][ ord($data{1}) ], + "SegDataStart" => $segdatastart, + "SegData" => $segdata ); + } + + // If this is a SOS (Start Of Scan) segment, then there is no more header data - the compressed image data follows + if ( $data{1} == "\xDA" ) + { + // Flag that we have hit the compressed image data - exit loop as no more headers available. + $hit_compressed_image_data = TRUE; + } + else + { + // Not an SOS - Read the next two bytes - should be the segment marker for the next segment + $data = fread( $filehnd, 2 ); + + // Check that the first byte of the two is 0xFF as it should be for a marker + if ( $data{0} != "\xFF" ) + { + // NO FF found - close file and return - JPEG is probably corrupted + fclose($filehnd); + return FALSE; + } + } + } + + // Close File + fclose($filehnd); + + // Return the header data retrieved + return $headerdata; } /** @@ -4600,33 +4600,33 @@ function jpg_get_dimensions($filename) { - if ( !file_exists($filename) ) - { - echo "Doesn't exist
"; - return false; - } - - $headers = get_jpeg_header_data($filename); - if ( !$headers ) - { - echo "Bad headers
"; - return false; - } - - $metadata = get_jpeg_intrinsic_values($headers); - if ( !$metadata ) - { - echo "Bad metadata:
" . print_r($metadata, true) . "

"; - return false; - } - - if ( !isset($metadata['Image Width']) || !isset($metadata['Image Height']) ) - { - echo "No metadata
"; - return false; - } - - return array($metadata['Image Width'], $metadata['Image Height']); + if ( !file_exists($filename) ) + { + echo "Doesn't exist
"; + return false; + } + + $headers = get_jpeg_header_data($filename); + if ( !$headers ) + { + echo "Bad headers
"; + return false; + } + + $metadata = get_jpeg_intrinsic_values($headers); + if ( !$metadata ) + { + echo "Bad metadata:
" . print_r($metadata, true) . "

"; + return false; + } + + if ( !isset($metadata['Image Width']) || !isset($metadata['Image Height']) ) + { + echo "No metadata
"; + return false; + } + + return array($metadata['Image Width'], $metadata['Image Height']); } /** @@ -4639,42 +4639,42 @@ function make_avatar_url($user_id, $avi_type, $user_email = false) { - static $img_types = array( - 'png' => IMAGE_TYPE_PNG, - 'gif' => IMAGE_TYPE_GIF, - 'jpg' => IMAGE_TYPE_JPG, - 'grv' => IMAGE_TYPE_GRV - ); - - if ( !is_int($user_id) ) - return false; - if ( !isset($img_types[$avi_type]) ) - return false; - - if ( $avi_type == 'grv' ) - { - if ( $user_email ) - { - return make_gravatar_url($user_email); - } - } - else - { - $avi_relative_path = '/' . getConfig('avatar_directory') . '/' . $user_id . '.' . $avi_type; - if ( !file_exists(ENANO_ROOT . $avi_relative_path) ) - { - return ''; - } - } - - $img_type = $img_types[$avi_type]; - - $dateline = @filemtime(ENANO_ROOT . $avi_relative_path); - $avi_id = pack('VVv', $dateline, $user_id, $img_type); - $avi_id = hexencode($avi_id, '', ''); - - // return scriptPath . $avi_relative_path; - return makeUrlNS('Special', "Avatar/$avi_id"); + static $img_types = array( + 'png' => IMAGE_TYPE_PNG, + 'gif' => IMAGE_TYPE_GIF, + 'jpg' => IMAGE_TYPE_JPG, + 'grv' => IMAGE_TYPE_GRV + ); + + if ( !is_int($user_id) ) + return false; + if ( !isset($img_types[$avi_type]) ) + return false; + + if ( $avi_type == 'grv' ) + { + if ( $user_email ) + { + return make_gravatar_url($user_email); + } + } + else + { + $avi_relative_path = '/' . getConfig('avatar_directory') . '/' . $user_id . '.' . $avi_type; + if ( !file_exists(ENANO_ROOT . $avi_relative_path) ) + { + return ''; + } + } + + $img_type = $img_types[$avi_type]; + + $dateline = @filemtime(ENANO_ROOT . $avi_relative_path); + $avi_id = pack('VVv', $dateline, $user_id, $img_type); + $avi_id = hexencode($avi_id, '', ''); + + // return scriptPath . $avi_relative_path; + return makeUrlNS('Special', "Avatar/$avi_id"); } /** @@ -4686,28 +4686,28 @@ function make_gravatar_url($email, $size = false) { - $email = md5($email); - - // gravatar parameters - if ( $size ) - { - $max_size = intval($size); - } - else - { - $max_x = intval(getConfig('avatar_max_width', '150')); - $max_y = intval(getConfig('avatar_max_height', '150')); - // ?s= - $max_size = ( $max_x > $max_y ) ? $max_y : $max_x; - } - - // ?r= - $rating = getConfig('gravatar_rating', 'g'); - - // final URL - $url = "http://www.gravatar.com/avatar/$email?r=$rating&s=$max_size"; - - return $url; + $email = md5($email); + + // gravatar parameters + if ( $size ) + { + $max_size = intval($size); + } + else + { + $max_x = intval(getConfig('avatar_max_width', '150')); + $max_y = intval(getConfig('avatar_max_height', '150')); + // ?s= + $max_size = ( $max_x > $max_y ) ? $max_y : $max_x; + } + + // ?r= + $rating = getConfig('gravatar_rating', 'g'); + + // final URL + $url = "http://www.gravatar.com/avatar/$email?r=$rating&s=$max_size"; + + return $url; } /** @@ -4718,20 +4718,20 @@ function get_image_filetype($filename) { - $filecontents = @file_get_contents($filename); - if ( empty($filecontents) ) - return false; - - if ( substr($filecontents, 0, 8) == "\x89\x50\x4e\x47\x0d\x0a\x1a\x0a" ) - return 'png'; - - if ( substr($filecontents, 0, 6) == 'GIF87a' || substr($filecontents, 0, 6) == 'GIF89a' ) - return 'gif'; - - if ( substr($filecontents, 0, 2) == "\xFF\xD8" ) - return 'jpg'; - - return false; + $filecontents = @file_get_contents($filename); + if ( empty($filecontents) ) + return false; + + if ( substr($filecontents, 0, 8) == "\x89\x50\x4e\x47\x0d\x0a\x1a\x0a" ) + return 'png'; + + if ( substr($filecontents, 0, 6) == 'GIF87a' || substr($filecontents, 0, 6) == 'GIF89a' ) + return 'gif'; + + if ( substr($filecontents, 0, 2) == "\xFF\xD8" ) + return 'jpg'; + + return false; } /** @@ -4741,11 +4741,11 @@ function enano_json_singleton() { - static $json_obj; - if ( !is_object($json_obj) ) - $json_obj = new Services_JSON(SERVICES_JSON_LOOSE_TYPE | SERVICES_JSON_SUPPRESS_ERRORS); - - return $json_obj; + static $json_obj; + if ( !is_object($json_obj) ) + $json_obj = new Services_JSON(SERVICES_JSON_LOOSE_TYPE | SERVICES_JSON_SUPPRESS_ERRORS); + + return $json_obj; } /** @@ -4756,15 +4756,15 @@ function enano_json_encode($data) { - /* - if ( function_exists('json_encode') ) - { - // using PHP5 with JSON support - return json_encode($data); - } - */ - - return Zend_Json::encode($data, true); + /* + if ( function_exists('json_encode') ) + { + // using PHP5 with JSON support + return json_encode($data); + } + */ + + return Zend_Json::encode($data, true); } /** @@ -4775,15 +4775,15 @@ function enano_json_decode($data) { - /* - if ( function_exists('json_decode') ) - { - // using PHP5 with JSON support - return json_decode($data); - } - */ - - return Zend_Json::decode($data, Zend_Json::TYPE_ARRAY); + /* + if ( function_exists('json_decode') ) + { + // using PHP5 with JSON support + return json_decode($data); + } + */ + + return Zend_Json::decode($data, Zend_Json::TYPE_ARRAY); } /** @@ -4794,19 +4794,19 @@ function enano_clean_json($json) { - // eliminate comments - $json = preg_replace(array( - // eliminate single line comments in '// ...' form - '#^\s*//(.*)$#m', - // eliminate multi-line comments in '/* ... */' form, at start of string - '#^\s*/\*(.+)\*/#Us', - // eliminate multi-line comments in '/* ... */' form, at end of string - '#/\*(.+)\*/\s*$#Us' - ), '', $json); - - $json = preg_replace('/([,\{\[])(?:[\r\n]+)([\s]*?)([a-z0-9_]+)([\s]*?):/', '\\1\\2"\\3" :', $json); - - return $json; + // eliminate comments + $json = preg_replace(array( + // eliminate single line comments in '// ...' form + '#^\s*//(.*)$#m', + // eliminate multi-line comments in '/* ... */' form, at start of string + '#^\s*/\*(.+)\*/#Us', + // eliminate multi-line comments in '/* ... */' form, at end of string + '#/\*(.+)\*/\s*$#Us' + ), '', $json); + + $json = preg_replace('/([,\{\[])(?:[\r\n]+)([\s]*?)([a-z0-9_]+)([\s]*?):/', '\\1\\2"\\3" :', $json); + + return $json; } /** @@ -4817,7 +4817,7 @@ function enano_trim_json($json) { - return preg_replace('/^([^{]+)\{/', '{', preg_replace('/\}([^}]+)$/', '}', $json)); + return preg_replace('/^([^{]+)\{/', '{', preg_replace('/\}([^}]+)$/', '}', $json)); } /** @@ -4826,22 +4826,22 @@ function profiler_start() { - global $_profiler; - $_profiler = array(); - - if ( !defined('ENANO_DEBUG') ) - return false; - - $_profiler[] = array( - 'point' => 'Profiling started', - 'time' => microtime_float(), - 'backtrace' => false, - 'mem' => false - ); - if ( function_exists('memory_get_usage') ) - { - $_profiler[ count($_profiler) - 1 ]['mem'] = memory_get_usage(); - } + global $_profiler; + $_profiler = array(); + + if ( !defined('ENANO_DEBUG') ) + return false; + + $_profiler[] = array( + 'point' => 'Profiling started', + 'time' => microtime_float(), + 'backtrace' => false, + 'mem' => false + ); + if ( function_exists('memory_get_usage') ) + { + $_profiler[ count($_profiler) - 1 ]['mem'] = memory_get_usage(); + } } /** @@ -4854,27 +4854,27 @@ function profiler_log($point, $allow_backtrace = true, $parent_event = false) { - if ( !defined('ENANO_DEBUG') ) - return false; - - global $_profiler; - $backtrace = false; - if ( $allow_backtrace && function_exists('debug_print_backtrace') ) - { - list(, $backtrace) = explode("\n", enano_debug_print_backtrace(true)); - } - $_profiler[] = array( - 'point' => $point, - 'time' => microtime_float(), - 'backtrace' => $backtrace, - 'mem' => false, - 'parent_event' => $parent_event - ); - if ( function_exists('memory_get_usage') ) - { - $_profiler[ count($_profiler) - 1 ]['mem'] = memory_get_usage(); - } - return count($_profiler) - 1; + if ( !defined('ENANO_DEBUG') ) + return false; + + global $_profiler; + $backtrace = false; + if ( $allow_backtrace && function_exists('debug_print_backtrace') ) + { + list(, $backtrace) = explode("\n", enano_debug_print_backtrace(true)); + } + $_profiler[] = array( + 'point' => $point, + 'time' => microtime_float(), + 'backtrace' => $backtrace, + 'mem' => false, + 'parent_event' => $parent_event + ); + if ( function_exists('memory_get_usage') ) + { + $_profiler[ count($_profiler) - 1 ]['mem'] = memory_get_usage(); + } + return count($_profiler) - 1; } /** @@ -4884,14 +4884,14 @@ function profiler_message($message) { - if ( !defined('ENANO_DEBUG') ) - return false; - - global $_profiler; - - $_profiler[] = array( - 'message' => $message, - ); + if ( !defined('ENANO_DEBUG') ) + return false; + + global $_profiler; + + $_profiler[] = array( + 'message' => $message, + ); } /** @@ -4901,7 +4901,7 @@ function profiler_dump() { - return $GLOBALS['_profiler']; + return $GLOBALS['_profiler']; } /** @@ -4911,91 +4911,91 @@ function profiler_make_html() { - if ( !defined('ENANO_DEBUG') ) - return ''; - - $profile = profiler_dump(); - - $html = '
'; - $html .= ''; - - $time_start = $time_last = $profile[0]['time']; - - foreach ( $profile as $i => $entry ) - { - // $time_since_last = $entry['time'] - $time_last; - // if ( $time_since_last < 0.01 ) - // continue; - - if ( isset($entry['message']) ) - { - $html .= "\n\n \n"; - - $html .= '' . "\n"; - $html .= ' ' . "\n"; - $html .= ' ' . "\n"; - $html .= '' . "\n"; - continue; - } - - $html .= "\n\n \n"; - - $html .= '' . "\n"; - $html .= ' ' . "\n"; - $html .= ' ' . "\n"; - $html .= '' . "\n"; - - $time = $entry['time'] - $time_start; - - $html .= '' . "\n"; - $html .= ' ' . "\n"; - $html .= ' ' . "\n"; - $html .= '' . "\n"; - - $time_label = 'Time since last event:'; - if ( $entry['parent_event'] && is_int($entry['parent_event']) && isset($profile[$entry['parent_event']]) ) - { - $time_last = $profile[$entry['parent_event']]['time']; - $time_label = "Time since event #{$entry['parent_event']}:"; - } - - $time = $entry['time'] - $time_last; - if ( $time < 0.0001 ) - $time_html = 'Marginal'; - else - $time_html = number_format($time, 6) . "s"; - - if ( $time > 0.02 ) - $time_html = "$time_html"; - - $html .= '' . "\n"; - $html .= ' ' . "\n"; - $html .= ' ' . "\n"; - $html .= '' . "\n"; - - if ( $entry['backtrace'] ) - { - $html .= '' . "\n"; - $html .= ' ' . "\n"; - $html .= ' ' . "\n"; - $html .= '' . "\n"; - } - - if ( $entry['mem'] ) - { - $html .= '' . "\n"; - $html .= ' ' . "\n"; - $html .= ' ' . "\n"; - $html .= '' . "\n"; - } - - $html .= "\n"; - - $time_last = $entry['time']; - } - $html .= '
Message $i
Message:' . htmlspecialchars($entry['message']) . '
Event $i
Event:' . htmlspecialchars($entry['point']) . '
Time since start:' . $time . 's
' . $time_label . '' . $time_html . '
Called from:' . htmlspecialchars($entry['backtrace']) . '
Total mem usage:' . htmlspecialchars($entry['mem']) . ' (bytes)
'; - - return $html; + if ( !defined('ENANO_DEBUG') ) + return ''; + + $profile = profiler_dump(); + + $html = '
'; + $html .= ''; + + $time_start = $time_last = $profile[0]['time']; + + foreach ( $profile as $i => $entry ) + { + // $time_since_last = $entry['time'] - $time_last; + // if ( $time_since_last < 0.01 ) + // continue; + + if ( isset($entry['message']) ) + { + $html .= "\n\n \n"; + + $html .= '' . "\n"; + $html .= ' ' . "\n"; + $html .= ' ' . "\n"; + $html .= '' . "\n"; + continue; + } + + $html .= "\n\n \n"; + + $html .= '' . "\n"; + $html .= ' ' . "\n"; + $html .= ' ' . "\n"; + $html .= '' . "\n"; + + $time = $entry['time'] - $time_start; + + $html .= '' . "\n"; + $html .= ' ' . "\n"; + $html .= ' ' . "\n"; + $html .= '' . "\n"; + + $time_label = 'Time since last event:'; + if ( $entry['parent_event'] && is_int($entry['parent_event']) && isset($profile[$entry['parent_event']]) ) + { + $time_last = $profile[$entry['parent_event']]['time']; + $time_label = "Time since event #{$entry['parent_event']}:"; + } + + $time = $entry['time'] - $time_last; + if ( $time < 0.0001 ) + $time_html = 'Marginal'; + else + $time_html = number_format($time, 6) . "s"; + + if ( $time > 0.02 ) + $time_html = "$time_html"; + + $html .= '' . "\n"; + $html .= ' ' . "\n"; + $html .= ' ' . "\n"; + $html .= '' . "\n"; + + if ( $entry['backtrace'] ) + { + $html .= '' . "\n"; + $html .= ' ' . "\n"; + $html .= ' ' . "\n"; + $html .= '' . "\n"; + } + + if ( $entry['mem'] ) + { + $html .= '' . "\n"; + $html .= ' ' . "\n"; + $html .= ' ' . "\n"; + $html .= '' . "\n"; + } + + $html .= "\n"; + + $time_last = $entry['time']; + } + $html .= '
Message $i
Message:' . htmlspecialchars($entry['message']) . '
Event $i
Event:' . htmlspecialchars($entry['point']) . '
Time since start:' . $time . 's
' . $time_label . '' . $time_html . '
Called from:' . htmlspecialchars($entry['backtrace']) . '
Total mem usage:' . htmlspecialchars($entry['mem']) . ' (bytes)
'; + + return $html; } // Might as well start the profiler, it has no external dependencies except from this file. @@ -5010,14 +5010,14 @@ function get_char_count($string, $char) { - $char = substr($char, 0, 1); - $count = 0; - for ( $i = 0; $i < strlen($string); $i++ ) - { - if ( $string{$i} == $char ) - $count++; - } - return $count; + $char = substr($char, 0, 1); + $count = 0; + for ( $i = 0; $i < strlen($string); $i++ ) + { + if ( $string{$i} == $char ) + $count++; + } + return $count; } /** @@ -5028,52 +5028,52 @@ function get_line_count($string) { - return ( get_char_count($string, "\n") ) + 1; + return ( get_char_count($string, "\n") ) + 1; } if ( !function_exists('sys_get_temp_dir') ) { - // Based on http://www.phpit.net/ - // article/creating-zip-tar-archives-dynamically-php/2/ - /** - * Attempt to get the system's temp directory. - * @return string or bool false on failure - */ - - function sys_get_temp_dir() - { - // Try to get from environment variable - if ( !empty($_ENV['TMP']) ) - { - return realpath( $_ENV['TMP'] ); - } - else if ( !empty($_ENV['TMPDIR']) ) - { - return realpath( $_ENV['TMPDIR'] ); - } - else if ( !empty($_ENV['TEMP']) ) - { - return realpath( $_ENV['TEMP'] ); - } - - // Detect by creating a temporary file - else - { - // Try to use system's temporary directory - // as random name shouldn't exist - $temp_file = tempnam( md5(uniqid(rand(), TRUE)), '' ); - if ( $temp_file ) - { - $temp_dir = realpath( dirname($temp_file) ); - unlink( $temp_file ); - return $temp_dir; - } - else - { - return FALSE; - } - } - } + // Based on http://www.phpit.net/ + // article/creating-zip-tar-archives-dynamically-php/2/ + /** + * Attempt to get the system's temp directory. + * @return string or bool false on failure + */ + + function sys_get_temp_dir() + { + // Try to get from environment variable + if ( !empty($_ENV['TMP']) ) + { + return realpath( $_ENV['TMP'] ); + } + else if ( !empty($_ENV['TMPDIR']) ) + { + return realpath( $_ENV['TMPDIR'] ); + } + else if ( !empty($_ENV['TEMP']) ) + { + return realpath( $_ENV['TEMP'] ); + } + + // Detect by creating a temporary file + else + { + // Try to use system's temporary directory + // as random name shouldn't exist + $temp_file = tempnam( md5(uniqid(rand(), TRUE)), '' ); + if ( $temp_file ) + { + $temp_dir = realpath( dirname($temp_file) ); + unlink( $temp_file ); + return $temp_dir; + } + else + { + return FALSE; + } + } + } } /** @@ -5082,25 +5082,25 @@ function fetch_rank_data() { - global $db, $session, $paths, $template, $plugins; // Common objects - global $lang; - - $sql = $session->generate_rank_sql(); - $q = $db->sql_query($sql); - if ( !$q ) - $db->_die(); - - $GLOBALS['user_ranks'] = array(); - global $user_ranks; - - while ( $row = $db->fetchrow($q) ) - { - $user_id = $row['user_id']; - $username = $row['username']; - $row = $session->calculate_user_rank($row); - $user_ranks[$username] = $row; - $user_ranks[$user_id] =& $user_ranks[$username]; - } + global $db, $session, $paths, $template, $plugins; // Common objects + global $lang; + + $sql = $session->generate_rank_sql(); + $q = $db->sql_query($sql); + if ( !$q ) + $db->_die(); + + $GLOBALS['user_ranks'] = array(); + global $user_ranks; + + while ( $row = $db->fetchrow($q) ) + { + $user_id = $row['user_id']; + $username = $row['username']; + $row = $session->calculate_user_rank($row); + $user_ranks[$username] = $row; + $user_ranks[$user_id] =& $user_ranks[$username]; + } } /** @@ -5109,42 +5109,42 @@ function generate_cache_userranks() { - global $db, $session, $paths, $template, $plugins; // Common objects - global $lang; - global $user_ranks; - - fetch_rank_data(); - - $user_ranks_stripped = array(); - foreach ( $user_ranks as $key => $value ) - { - if ( is_int($key) ) - $user_ranks_stripped[$key] = $value; - } - - $ranks_exported = "var_export_string($user_ranks_stripped) . ';'; - $uid_map = array(); - foreach ( $user_ranks as $id => $row ) - { - if ( !is_int($id) ) - { - $username = $id; - continue; - } - - $un_san = addslashes($username); - $ranks_exported .= "\n\$user_ranks['$un_san'] =& \$user_ranks[{$row['user_id']}];"; - } - $ranks_exported .= "\n\ndefine('ENANO_RANKS_CACHE_LOADED', 1); \n?>"; - - // open ranks cache file - $fh = @fopen( ENANO_ROOT . '/cache/cache_ranks.php', 'w' ); - if ( !$fh ) - return false; - fwrite($fh, $ranks_exported); - fclose($fh); - - return true; + global $db, $session, $paths, $template, $plugins; // Common objects + global $lang; + global $user_ranks; + + fetch_rank_data(); + + $user_ranks_stripped = array(); + foreach ( $user_ranks as $key => $value ) + { + if ( is_int($key) ) + $user_ranks_stripped[$key] = $value; + } + + $ranks_exported = "var_export_string($user_ranks_stripped) . ';'; + $uid_map = array(); + foreach ( $user_ranks as $id => $row ) + { + if ( !is_int($id) ) + { + $username = $id; + continue; + } + + $un_san = addslashes($username); + $ranks_exported .= "\n\$user_ranks['$un_san'] =& \$user_ranks[{$row['user_id']}];"; + } + $ranks_exported .= "\n\ndefine('ENANO_RANKS_CACHE_LOADED', 1); \n?>"; + + // open ranks cache file + $fh = @fopen( ENANO_ROOT . '/cache/cache_ranks.php', 'w' ); + if ( !$fh ) + return false; + fwrite($fh, $ranks_exported); + fclose($fh); + + return true; } /** @@ -5153,14 +5153,14 @@ function load_rank_data() { - if ( file_exists( ENANO_ROOT . '/cache/cache_ranks.php' ) ) - { - @include(ENANO_ROOT . '/cache/cache_ranks.php'); - } - if ( !defined('ENANO_RANKS_CACHE_LOADED') ) - { - fetch_rank_data(); - } + if ( file_exists( ENANO_ROOT . '/cache/cache_ranks.php' ) ) + { + @include(ENANO_ROOT . '/cache/cache_ranks.php'); + } + if ( !defined('ENANO_RANKS_CACHE_LOADED') ) + { + fetch_rank_data(); + } } /** @@ -5169,45 +5169,45 @@ function purge_all_caches() { - global $cache; - if ( $dh = opendir(ENANO_ROOT . '/cache') ) - { - $cache->purge('page_meta'); - $cache->purge('anon_sidebar'); - $cache->purge('plugins'); - $cache->purge('wiki_edit_notice'); - - $data_files = array( - 'aes_decrypt.php', - // ranks cache is stored using a custom engine (not enano's default cache) - 'cache_ranks.php' - ); - while ( $file = @readdir($dh) ) - { - $fullpath = ENANO_ROOT . "/cache/$file"; - // we don't want to mess with directories - if ( !is_file($fullpath) ) - continue; - - // data files - if ( in_array($file, $data_files) ) - unlink($fullpath); - // template files - else if ( preg_match('/\.(?:tpl|css)\.php$/', $file) ) - unlink($fullpath); - // compressed javascript - else if ( preg_match('/^jsres_(?:[A-z0-9_-]+)\.js\.json$/', $file) ) - unlink($fullpath); - // tinymce stuff - else if ( preg_match('/^tiny_mce_(?:[a-f0-9]+)\.gz$/', $file) ) - unlink($fullpath); - // language files - else if ( preg_match('/^lang_json_(?:[a-f0-9]+?)\.php$/', $file) || preg_match('/^(?:cache_)?lang_(?:[0-9]+?)\.php$/', $file) ) - unlink($fullpath); - } - return true; - } - return false; + global $cache; + if ( $dh = opendir(ENANO_ROOT . '/cache') ) + { + $cache->purge('page_meta'); + $cache->purge('anon_sidebar'); + $cache->purge('plugins'); + $cache->purge('wiki_edit_notice'); + + $data_files = array( + 'aes_decrypt.php', + // ranks cache is stored using a custom engine (not enano's default cache) + 'cache_ranks.php' + ); + while ( $file = @readdir($dh) ) + { + $fullpath = ENANO_ROOT . "/cache/$file"; + // we don't want to mess with directories + if ( !is_file($fullpath) ) + continue; + + // data files + if ( in_array($file, $data_files) ) + unlink($fullpath); + // template files + else if ( preg_match('/\.(?:tpl|css)\.php$/', $file) ) + unlink($fullpath); + // compressed javascript + else if ( preg_match('/^jsres_(?:[A-z0-9_-]+)\.js\.json$/', $file) ) + unlink($fullpath); + // tinymce stuff + else if ( preg_match('/^tiny_mce_(?:[a-f0-9]+)\.gz$/', $file) ) + unlink($fullpath); + // language files + else if ( preg_match('/^lang_json_(?:[a-f0-9]+?)\.php$/', $file) || preg_match('/^(?:cache_)?lang_(?:[0-9]+?)\.php$/', $file) ) + unlink($fullpath); + } + return true; + } + return false; } /** @@ -5218,27 +5218,27 @@ function which($executable) { - $path = ( isset($_ENV['PATH']) ) ? $_ENV['PATH'] : ( isset($_SERVER['PATH']) ? $_SERVER['PATH'] : false ); - if ( !$path ) - // couldn't get OS's PATH - return false; - - $win32 = ( PHP_OS == 'WINNT' || PHP_OS == 'WIN32' ); - $extensions = $win32 ? array('.exe', '.com', '.bat') : array(''); - $separator = $win32 ? ';' : ':'; - $paths = explode($separator, $path); - foreach ( $paths as $dir ) - { - foreach ( $extensions as $ext ) - { - $fullpath = "$dir/{$executable}{$ext}"; - if ( @file_exists($fullpath) && @is_executable($fullpath) ) - { - return $fullpath; - } - } - } - return false; + $path = ( isset($_ENV['PATH']) ) ? $_ENV['PATH'] : ( isset($_SERVER['PATH']) ? $_SERVER['PATH'] : false ); + if ( !$path ) + // couldn't get OS's PATH + return false; + + $win32 = ( PHP_OS == 'WINNT' || PHP_OS == 'WIN32' ); + $extensions = $win32 ? array('.exe', '.com', '.bat') : array(''); + $separator = $win32 ? ';' : ':'; + $paths = explode($separator, $path); + foreach ( $paths as $dir ) + { + foreach ( $extensions as $ext ) + { + $fullpath = "$dir/{$executable}{$ext}"; + if ( @file_exists($fullpath) && @is_executable($fullpath) ) + { + return $fullpath; + } + } + } + return false; } /** @@ -5249,51 +5249,51 @@ function write_test($filename) { - // We need to actually _open_ the file to make sure it can be written, because sometimes this fails even when is_writable() returns - // true on Windows/IIS servers. Don't ask me why. - - $file = ENANO_ROOT . '/' . $filename; - if ( is_dir($file) ) - { - $file = rtrim($file, '/') . '/' . 'enanoinstalltest.txt'; - if ( file_exists($file) ) - { - $fp = @fopen($file, 'a+'); - if ( !$fp ) - return false; - fclose($fp); - unlink($file); - return true; - } - else - { - $fp = @fopen($file, 'w'); - if ( !$fp ) - return false; - fclose($fp); - unlink($file); - return true; - } - } - else - { - if ( file_exists($file) ) - { - $fp = @fopen($file, 'a+'); - if ( !$fp ) - return false; - fclose($fp); - return true; - } - else - { - $fp = @fopen($file, 'w'); - if ( !$fp ) - return false; - fclose($fp); - return true; - } - } + // We need to actually _open_ the file to make sure it can be written, because sometimes this fails even when is_writable() returns + // true on Windows/IIS servers. Don't ask me why. + + $file = ENANO_ROOT . '/' . $filename; + if ( is_dir($file) ) + { + $file = rtrim($file, '/') . '/' . 'enanoinstalltest.txt'; + if ( file_exists($file) ) + { + $fp = @fopen($file, 'a+'); + if ( !$fp ) + return false; + fclose($fp); + unlink($file); + return true; + } + else + { + $fp = @fopen($file, 'w'); + if ( !$fp ) + return false; + fclose($fp); + unlink($file); + return true; + } + } + else + { + if ( file_exists($file) ) + { + $fp = @fopen($file, 'a+'); + if ( !$fp ) + return false; + fclose($fp); + return true; + } + else + { + $fp = @fopen($file, 'w'); + if ( !$fp ) + return false; + fclose($fp); + return true; + } + } } /** @@ -5303,20 +5303,20 @@ function install_get_crypto_backend() { - $crypto_backend = 'none'; - - // Extension test: BCMath - if ( function_exists('bcadd') ) - $crypto_backend = 'bcmath'; - - // Extension test: Big_Int - if ( function_exists('bi_from_str') ) - $crypto_backend = 'bigint'; - - // Extension test: GMP - if ( function_exists('gmp_init') ) - $crypto_backend = 'gmp'; - - return $crypto_backend; + $crypto_backend = 'none'; + + // Extension test: BCMath + if ( function_exists('bcadd') ) + $crypto_backend = 'bcmath'; + + // Extension test: Big_Int + if ( function_exists('bi_from_str') ) + $crypto_backend = 'bigint'; + + // Extension test: GMP + if ( function_exists('gmp_init') ) + $crypto_backend = 'gmp'; + + return $crypto_backend; }