This software requires PHP 5.1+ to run!"); } // ############################################################################ // INIT PRGM // ############################################################################ unset($pages_md_arr, $mainsettings); require_once(ROOT_PATH . 'includes/init.php'); require_once(ROOT_PATH . 'includes/enablegzip.php'); // ############################################################################ // UNSUBSCRIBE USER FROM EMAILS // ############################################################################ if(isset($_GET['unsubscribe_id']) && ctype_digit($_GET['unsubscribe_id'])) { $unsubscribe_id = (string)$_GET['unsubscribe_id']; $user_is_unsubscribed = false; if($unsubscribe_id) { $join_date = substr($unsubscribe_id, 0, 10); $user_id = substr($unsubscribe_id, 10); // does user exist? if($join_date AND $user_id AND $user_arr = $DB->query_first('SELECT userid FROM {users} WHERE userid = %d AND joindate = %d LIMIT 1',$user_id, $join_date)) { $DB->query('UPDATE {users} SET receive_emails = 0 WHERE userid = %d', $user_arr['userid']); $user_is_unsubscribed = true; } } $unsubscribe_msg = $user_is_unsubscribed ? $sdlanguage['user_unsubscribed'] : $sdlanguage['user_not_unsubscribed']; StopLoadingPage('

' . $unsubscribe_msg . '

', '', 0, ''); } // ############################################################################ // WEBSITE OFFLINE? // ############################################################################ if(($mainsettings_siteactivation == 'off') && !$userinfo['adminaccess'] && !$userinfo['offlinecategoryaccess']) { if(isset($mainsettings_site_inactive_redirect)) //SD342 { if(sd_check_url($mainsettings_site_inactive_redirect)) { StopLoadingPage('', $sdlanguage['website_offline'], 503, $mainsettings_site_inactive_redirect); } } StopLoadingPage($mainsettings_offmessage, $sdlanguage['website_offline']); } // ############################################################################ // BUILD CATEGORIES FOR MENU // ############################################################################ // If user is not logged in then do not display member-only categories. // For that "$user_has_categories" stores that flag: $user_has_categories = !empty($userinfo['categorymenuids']); unset($categoryname,$categorylink,$categoryids,$sessioncreated); $i = 0; if($user_has_categories && !empty($pages_md_arr)) { foreach($pages_md_arr as $cat_id => $category) { if(empty($category['parentid']) && @in_array($cat_id, $userinfo['categorymenuids'])) { if(strlen($category['image'] > 4)) { // SD313x - Shouldn't images only be for old skins' hover menu??? // hover image (min. length of 4) if(isset($category['hoverimage']) && (strlen($category['hoverimage'])>3) /* ??? && ($design['skin_engine'] != 2) ??? */) { $categoryname[$i] = '' .
            addslashes($category['name']) . ''; } else { $categoryname[$i] = '' . addslashes(str_replace('[sdurl]',SITE_URL,$category['name'])) . ''; } } else { $categoryname[$i] = str_replace('[sdurl]',SITE_URL,$category['name']); } $categorylink[$i] = isset($category['link'][0]) ? $category['link'] : RewriteLink('index.php?categoryid=' . $cat_id); $categorytarget[$i] = isset($category['target'][0]) ? $category['target'] : '_self'; $categoryids[$i] = (int)$cat_id; $i++; } } } $categoryrows = $i; unset($i, $cat_id, $category, $category_parents); $article_arr = null; $article_id = $page_identified_by_SEO = $page_to_load = false; $categoryid = 0; $hasParams = strpos($uri, '?'); $uri = $_SERVER['REQUEST_URI']; $do301 = false; $sd_variable_arr = array(); $sd_variable_arr_count = 0; /* //SD342 Note: regardless of "modrewrite" option check the URL to allow for way better detection of old links and needed redirecting. Supported cases and notes ("http://..." left out) *) Clones of the Articles plugin require an extra plugin id URL parameter "pid" so that SEO works, like /blog.htm?pid=5008&p5008_articleid=2 *) blog.htm?p2_articleid=5 TODO: Article is opened, but no redirect yet if SEO is enabled *) /blog/p2_articleid/5 If SEO is ON and the article does have a SEO title, this will 301 to the correct SEO-enabled URL, e.g. http://www.dom.com/blog/myarticle.htm *) /blog/p2_articleid/5 */ $check_vars = $article_url_wrong = $next_is_articleid = false; if(strlen(SITE_URL)) { // Test: http://127.0.0.1:8080/sdcom/index.php?categoryid=1&p2_articleid=59#comments if(strlen($uri) && !strstr($uri, '/index.php') && substr($uri, -4) != '.php') { // get request_uri and remove any trailing slash // ex: /program_folder/features.html?test=1 // ex: /program_folder $uri = substr($uri, -1) == '/' ? substr($uri, 0, -1) : $uri; // find the subfolders of the url // ex: /program_folder/ $sub_folders = preg_replace("#https?://[^/]+(/?.*)#", "\$1", SITE_URL); // now subtract the subfolders from the request_uri // this will leave us with the variables in the url // ex: home/articles.html?test=1 $url_variables = substr($uri, strlen($sub_folders)); $sd_url_params = array(); $prev_seo = ''; $idx = $last_valid_var = $prev_id = 0; if(strlen($url_variables)) { // explode the url variables $sd_variable_arr = explode('/', $url_variables); $sd_variable_arr_count = count($sd_variable_arr); $last_var = $sd_variable_arr_count - 1; // search and remove real php arguments // we only want the friendly url variables // the last key in the array could be something like: // home.html?alpha=1&beta=2 (so get rid of ?alpha=1&beta=2) if(($args_pos = strpos($sd_variable_arr[$last_var], '?')) !== false) { $sd_variable_arr[$last_var] = substr($sd_variable_arr[$last_var], 0, $args_pos); } // remove url extension $last_var_org = $sd_variable_arr[$last_var]; if(strlen($mainsettings_url_extension) && (strpos($sd_variable_arr[$last_var], $mainsettings_url_extension) !== false) ) { $sd_variable_arr[$last_var] = substr($sd_variable_arr[$last_var], 0, -strlen($mainsettings_url_extension)); } //SD341: check and extract for SD 2.6 SEO names like "&pXXXX_articleid=YYYY" (incl. clones) if(preg_match('#p([0-9]*)_articleid=([0-9]*)#',$url_variables,$article_matches) && (count($article_matches)==3)) { array_shift($article_matches); $pid = Is_Valid_Number($article_matches[0],0,2,9999); $article_id = Is_Valid_Number($article_matches[1],0,1,999999); if($article_arr = sd_cache_article($pid, $article_id)) { $categoryid = (int)$article_arr['categoryid']; if($mainsettings_modrewrite && isset($article_arr['seo_title']) && strlen($article_arr['seo_title'])) { $do301 = true; $page_identified_by_SEO = true; } } } unset($article_matches); //SD342: if sub-categories in URL are allowed AND there are more than 1 variables: if(!$page_identified_by_SEO && $sd_variable_arr_count) { $pid = GetVar('pid', 2, 'whole_number'); foreach($sd_variable_arr as $tmp) { $tmp2 = false; // Check if variable is a SEO page if($tmp2 = (!empty($pages_seo_arr[$tmp]) ? $pages_md_arr[$pages_seo_arr[$tmp]] : false)) { if($tmp2 && isset($sd_cache['category_parents'][$prev_id]) && @in_array($tmp2['categoryid'], $sd_cache['category_parents'][$prev_id])) { // Redirect SEO URL to "index.php?categoryid=xxx" format if(!$mainsettings_modrewrite) $do301 = true; $categoryid = (int)$tmp2['categoryid']; $last_valid_var = $idx; } else { if(!empty($tmp2['categoryid'])) //SD342 if present, use it { $categoryid = (int)$tmp2['categoryid']; $page_identified_by_SEO = true; } else if($idx < $sd_variable_arr_count) $do301 = true; break; } } // Check if current param is like "pXXX_articleid" and next param is an article id elseif(($idx < $last_var) && preg_match('#p([0-9]*)_articleid#',$tmp,$matches) && (count($matches)==2)) { if($pid = Is_Valid_Number($matches[1],0,2,9999)) { $next_is_articleid = ($pid == 2) || (($pid >= 5000) && ($pid <= 9999)); } else { unset($pid); } } elseif($next_is_articleid) { // Catches old 2.6 article link like "/blog/p2_articleid/59" $next_is_articleid = false; $article_id = Is_Valid_Number($tmp,0,1,999999); if($article_arr = sd_cache_article($pid, $article_id)) { $article_arr['pluginid'] = $pid; $categoryid = (int)$article_arr['categoryid']; // if SEO is enabled and article has SEO title, then redirect if($mainsettings_modrewrite && isset($article_arr['seo_title']) && strlen($article_arr['seo_title'])) { $do301 = true; $page_identified_by_SEO = true; } } else { $article_url_wrong = true; unset($article_arr,$article_id); } } // Check if the LAST param is an article SEO elseif($idx == $last_var) { if($article_seo_arr = sd_cache_articles($pid)) { if(isset($article_seo_arr[$tmp])) { $article_id = $article_seo_arr[$tmp]; } else //SD342 check for old 2.6 article link if(preg_match('#-a([0-9]*)$#',$tmp,$matches) && (count($matches)==2) && (false!==(array_search($matches[1],$article_seo_arr)))) { $article_id = (int)$matches[1]; $do301 = true; } } } else { // Unknown "variable", assume from here on "friendly" params and quit if(strlen($prev_seo)) { $page_identified_by_SEO = true; $page_to_load = $prev_seo; $check_vars = true; } break; } $idx++; if($idx == $sd_variable_arr_count) { // If the loop did not break and this is the last variable, then the URL is valid $page_identified_by_SEO = true; $page_to_load = $article_id ? $prev_seo : $tmp; } if($tmp2!==false) { $prev_id = $tmp2['categoryid']; $prev_seo = $tmp2['urlname']; } } } if($page_identified_by_SEO && $article_id && $pid && !isset($article_arr)) { if($article_arr = sd_cache_article($pid, $article_id)) { //SD342 if article is not active, then do 404 and redirect to page $hasAccess = !empty($userinfo['adminaccess']) || (empty($article_arr['access_view']) || in_array($userinfo['usergroupid'],explode('|',$article_arr['access_view']))); if(!$hasAccess || empty($article_arr['settings']) || (($article_arr['settings'] & 2) == 0)) { $new_link = RewriteLink('index.php?categoryid='.(int)$categoryid); StopLoadingPage('', '', 404, $new_link); } else if($sd_variable_arr_count > 1) { $page_to_load = $sd_variable_arr[$sd_variable_arr_count - 2]; $page_identified_by_SEO = true; } } } // If indicated by "$check_vars", copy extra params to "$sd_url_params" // so that these can be picked up by a plugin // Example: http://localhost:8080/sdcom/testing/sd3-media-gallery/p5020/gallery/2 // Page is: "sd3-media-gallery.htm" with params "p5020/section/2" if($check_vars) { for($idx; $idx <= $last_var; $idx++) { $sd_url_params[] = $sd_variable_arr[$idx]; } } unset($idx, $prev_id, $prev_seo, $pid, $tmp, $tmp2); //SD341: redirect old article URL to new SEO URL: if($do301 && $page_identified_by_SEO && îsset($article_arr) && is_array($article_arr)) { //old link: http://www.site.com/old-article-url-a59.htm = article 59 $new_link = RewriteLink('index.php?categoryid='.$article_arr['categoryid']); if($mainsettings_modrewrite) { $new_link = preg_replace('#'.SD_QUOTED_URL_EXT.'$#', '/' . $article_arr['seo_title'] . $mainsettings_url_extension, $new_link); } else { $pid = $article_arr['pluginid']; $new_link .= '&pid='.$pid.'&p'.$pid.'_articleid='.$article_arr['articleid']; } StopLoadingPage('', '', 301, $new_link); } elseif($do301 && $categoryid) { $new_link = RewriteLink('index.php?categoryid='.(int)$categoryid); StopLoadingPage('', '', 301, $new_link); } elseif(!$categoryid) { StopLoadingPage('' . $sdlanguage['redirect_to_homepage'] . '', $sdlanguage['page_not_found'], 404); } } } else // If "index.php" is detected then check for categoryid. // This will then redirect (301) to the SEO URL of the targeted page if user // has permission for it or otherwise do 404 and redirect to homepage. if($mainsettings_modrewrite && strlen($uri) && strstr($uri, '/index.php')) { $categoryid = (int)GetVar('categoryid', 1, 'whole_number'); if($user_has_categories && isset($pages_md_arr[$categoryid])) { $new_link = RewriteLink('index.php?categoryid='.(int)$categoryid); //SD342: check and extract for SD 2.6 SEO names like "&pXXXX_articleid=YYYY" (incl. clones) //http://127.0.0.1:8080/sdcom/index.php?categoryid=1&p2_articleid=59#comments if(preg_match('#p([0-9]*)_articleid=([0-9]*)#',$uri,$article_matches) && (count($article_matches)==3)) { array_shift($article_matches); $pid = Is_Valid_Number($article_matches[0],0,2,9999); $article_id = Is_Valid_Number($article_matches[1],0,1,999999); if($article_arr = sd_cache_article($pid, $article_id)) { if($mainsettings_modrewrite && isset($article_arr['seo_title']) && strlen($article_arr['seo_title'])) { $new_link = RewriteLink('index.php?categoryid='.(int)$categoryid.'&p'.$pid.'_articleid='.$article_id); } } } StopLoadingPage('', '', 301, $new_link); } else { $new_link = RewriteLink('index.php?categoryid=1'); StopLoadingPage('', '', 404, $new_link); } } else //SD342: SEO off, check and extract article id if possible if(!$mainsettings_modrewrite && strlen($uri) && strstr($uri, '/index.php')) { $categoryid = (int)GetVar('categoryid', 1, 'whole_number'); if($user_has_categories && isset($pages_md_arr[$categoryid])) { $new_link = RewriteLink('index.php?categoryid='.(int)$categoryid); if(preg_match('#p([0-9]*)_articleid=([0-9]*)#',$uri,$article_matches) && (count($article_matches)==3)) { array_shift($article_matches); $pid = Is_Valid_Number($article_matches[0],0,2,9999); $article_id = Is_Valid_Number($article_matches[1],0,1,999999); $article_arr = sd_cache_article($pid, $article_id); } } } } if(!$categoryid) { $categoryid = GetVar('categoryid', 1, 'whole_number'); } elseif($article_url_wrong) { // If an article was specified, but not found, then do 404 $new_link = RewriteLink('index.php?categoryid='.$categoryid); StopLoadingPage('', '', 404, $new_link); } unset($check_vars, $article_url_wrong, $next_is_articleid); define('PAGE_ID', (int)$categoryid); //SD322: If user is logged in, update session with current location if(($usersystem['name'] == 'Subdreamer') && !empty($userinfo['userid'])) { $DB->query("UPDATE {sessions} SET location = '%s' WHERE userid = %d AND location <> '%s' AND admin = 0", PAGE_ID, $userinfo['userid'], PAGE_ID); } // Below variable is used in functions_frontend for menu generation: $root_parent_categoryid = GetRootCategoryid(PAGE_ID); // GET SKIN, PAGE AND LAYOUT // Check for skin-design's cache file, containing batches of 10 pages: $theme_arr = false; $designs = array(); $designs_cacheid = (int)floor(PAGE_ID/10); if($SDCache && $SDCache->IsActive() && (($getdesigns = $SDCache->read_var(CACHE_PAGE_DESIGN.$designs_cacheid, 'designs')) !== false)) { if(isset($getdesigns['designs'][PAGE_ID])) $theme_arr = (array)$getdesigns['designs'][PAGE_ID]; } if(!$theme_arr) { // Get all important design data; w/COMPLETE row from "skins" for further use! //SD342: rewritten: only select design of current page, not all due to memory usage if($getdesigns = $DB->query( 'SELECT c.categoryid, d.maxplugins, d.designpath, d.designid, d.design_name, c.sslurl, c.name AS categoryname, c.metadescription, c.metakeywords, c.urlname, c.title, s.skinid, s.skin_engine, s.name skinname, s.activated, s.numdesigns, s.previewimage, s.authorname, s.authorlink, s.folder_name, s.menu_level0_opening, s.menu_level0_closing, s.menu_submenu_opening, s.menu_submenu_closing, s.menu_item_opening, s.menu_item_closing, s.menu_item_link, d.layout, s.header, s.footer, s.error_page FROM {designs} d INNER JOIN {categories} c ON c.designid = d.designid INNER JOIN {skins} s ON s.skinid = d.skinid WHERE c.categoryid BETWEEN %d AND %d', $designs_cacheid*10,$designs_cacheid*10+9)) { while($design = $DB->fetch_array($getdesigns,null,MYSQL_ASSOC)) { $cid = (int)$design['categoryid']; if($cid==PAGE_ID) { $theme_arr = $design; } $designs[$cid] = $design; } if($SDCache && $SDCache->IsActive()) $SDCache->write_var(CACHE_PAGE_DESIGN.$designs_cacheid, 'designs', array('designs' => $designs), false); } } unset($cid,$designs,$designs_cacheid,$getdesigns); if(!$theme_arr || empty($theme_arr['categoryid'])) { StopLoadingPage('' . $sdlanguage['redirect_to_homepage'] . '', $sdlanguage['page_not_found'], 404); } // ############################################################################# // CHECK SSL ACCESS (SD322) // ############################################################################# // Let's check if this category is allowed to be viewed without SSL... if not it is a good time to escape if(!empty($mainsettings['forcessl']) && !empty($theme_arr['sslurl']) && (empty($_SERVER['HTTPS']) || strtolower($_SERVER['HTTPS'])=='off')) { StopLoadingPage('' . $sdlanguage['redirect_to_homepage'] . '', $sdlanguage['page_not_found'], 404); } // ############################################################################# // CHECK PAGE ACCESS // ############################################################################# if((!$user_has_categories || !@in_array(PAGE_ID, $userinfo['categoryviewids'])) && (!$userinfo['adminaccess'] && !$userinfo['offlinecategoryaccess']) ) { //SD342: differentiate error message for guests; added new title phrase if(empty($userinfo['loggedin'])) { StopLoadingPage($sdlanguage['no_view_access_guests'],$sdlanguage['no_view_access_title_guests']); } StopLoadingPage($sdlanguage['no_view_access'],$sdlanguage['no_view_access_title']); } define('SKIN_ENGINE', $theme_arr['skin_engine']); define('SKIN_LAYOUT_NAME', $theme_arr['design_name']); //SD342 // ############################################################################# // SET COPYRIGHT // ############################################################################# $copyright = $mainsettings_copyrighttext; //SD322: take into account old BFO column AND new option from branding file if(!defined('BRANDING_FREE') && empty($mainsettings_bfo)) { $copyright .= ' ' . $sdlanguage['website_powered_by'] . ' ' . PRGM_NAME . ''; } // ############################################################################# // SET RSS LINKS // ############################################################################# $rss_link = ''; if($mainsettings_enable_rss) { $rss_link .= ' ' . "\n"; } if($mainsettings_enable_rss_forum) { $rss_link .= ' ' . "\n"; } // ############################################################################# // FORMAT WEBSITE TITLE // ############################################################################# if(!strlen($mainsettings_title_separator)) { $mainsettings_title_separator = ' '; } // combine page title with website title? if($mainsettings_categorytitle && strlen($theme_arr['title'])) { if(empty($mainsettings_title_order)) { $mainsettings_websitetitle .= $mainsettings_title_separator . $theme_arr['title']; } else { $mainsettings_websitetitle = $theme_arr['title'] . $mainsettings_title_separator . $mainsettings_websitetitle; } } // ############################################################################# // FORMAT WEBSITE META DESCRIPTION AND KEYWORDS // ############################################################################# // replace website meta description with page meta description? $mainsettings_metadescription = strlen($theme_arr['metadescription']) ? $theme_arr['metadescription'] : $mainsettings_metadescription; // add page meta keywords to website meta keywords $mainsettings_metakeywords .= (strlen($mainsettings_metakeywords) ? ',' : '') . $theme_arr['metakeywords']; if(isset($article_arr) && @is_array($article_arr)) { // replace current meta description with article meta description? $mainsettings_metadescription = strlen($article_arr['metadescription']) ? $article_arr['metadescription'] : $mainsettings_metadescription; // add article meta keywords to current meta keywords $mainsettings_metakeywords .= (strlen($mainsettings_metakeywords) ? ',' : '') . $article_arr['metakeywords']; //SD342: different combinations with article title first switch($mainsettings_title_order) { case 0: break; case 1: $mainsettings_websitetitle = $mainsettings_categorytitle?$mainsettings_websitetitle:$theme_arr['title'].$mainsettings_title_separator.$mainsettings_websitetitle; break; case 2: $mainsettings_websitetitle = strip_tags($article_arr['title']); break; case 3: $mainsettings_websitetitle = strlen($article_arr['title']) ? (strip_tags($article_arr['title']).$mainsettings_title_separator.$mainsettings_websitetitle):$mainsettings_websitetitle; break; case 4: $mainsettings_websitetitle = strlen($article_arr['title']) ? (strip_tags($article_arr['title']).$mainsettings_title_separator.$theme_arr['title']):$mainsettings_websitetitle; break; case 5: $mainsettings_websitetitle = strlen($article_arr['title']) ? (strip_tags($article_arr['title']).$mainsettings_title_separator.$theme_arr['title'].$mainsettings_title_separator.$mainsettings_websitetitle_original):$mainsettings_websitetitle; break; case 6: $mainsettings_websitetitle = strlen($article_arr['title']) ? (strip_tags($article_arr['title']).$mainsettings_title_separator.$mainsettings_websitetitle_original.$mainsettings_title_separator.$theme_arr['title']):$mainsettings_websitetitle; break; } } // SD313: remove trailing comma (HTML error) if(!empty($mainsettings_metakeywords) && (substr($mainsettings_metakeywords,-1) == ',')) { $mainsettings_metakeywords = substr($mainsettings_metakeywords,0,-1); } // DO NOT CLEAR "$article_arr" variable! // ############################################################################ // IMAGE GALLERY SECTION/TITLE IN PAGE TITLE // ############################################################################ $p17_sectionid = GetVar('p17_sectionid', null, 'whole_number', false, true); $p17_imageid = GetVar('p17_imageid', null, 'whole_number', false, true); if(!empty($p17_sectionid)) { if(empty($p17_imageid) && ($sectionname = $DB->query_first('SELECT name FROM {p17_sections} WHERE sectionid = %d', $p17_sectionid))) { if(empty($mainsettings_title_order)) { $mainsettings_websitetitle .= $mainsettings_title_separator . $sectionname[0]; } else { $mainsettings_websitetitle = $sectionname[0] . $mainsettings_title_separator . $mainsettings_websitetitle; } unset($sectionname); } else if(!empty($p17_imageid)) { if($imagetitle = $DB->query_first('SELECT title FROM {p17_images} WHERE imageid = %d', $p17_imageid)) { if(empty($mainsettings_title_order)) { $mainsettings_websitetitle .= $mainsettings_title_separator . $imagetitle[0]; } else { $mainsettings_websitetitle = $imagetitle[0] . $mainsettings_title_separator . $mainsettings_websitetitle; } unset($imagetitle); } } } // ############################################################################# // INITIALIZE VARIABLES TO PREVENT ATTACK // ############################################################################# $customplugincount = 0; $customplugin = array(); $custompluginfile = array(); $customplugin_ids = array(); $pluginids = array(); $pluginname = array(); $pluginpath = array(); $custompluginoptions = array(); //SD342 $c_customplugin_ids = array(); $c_customplugin = array(); $c_custompluginfile = array(); $c_custompluginoptions = array(); $c_pluginids = array(); $c_pluginname = array(); $c_pluginpath = array(); $plugin_header = ''; // SD 313 - used again! $design_maxplugins = $theme_arr['maxplugins']; // ############################################################################# // INITIALIZE AND LOAD CACHED CATEGORY IF ENABLED // ############################################################################# $IsCached = false; // DO NOT REMOVE! $cache_id = CACHE_PAGE_PREFIX.PAGE_ID; if($SDCache && $SDCache->IsActive()) // SD313x { // Check for category cache file, containing multiple arrays: if(($c_categoryid = $SDCache->read_var($cache_id, 'c_categoryid')) !== false) { // Plugin arrays from cache file are loaded in global context if($cache_file = $SDCache->CalcCachefileForID($cache_id)) { if(is_file($cache_file) && @include($cache_file)) { // Is category really correct? if(!empty($c_categoryid) && ($c_categoryid == PAGE_ID)) { // Assign cached arrays to the regular arrays: $IsCached = true; $customplugin = $c_customplugin; $custompluginfile = $c_custompluginfile; $customplugin_ids = $c_customplugin_ids; $custompluginoptions = isset($c_custompluginoptions)?$c_custompluginoptions:array(); //SD342 $pluginids = $c_pluginids; $pluginname = $c_pluginname; $pluginpath = $c_pluginpath; } unset($c_customplugin,$c_customplugin_ids,$c_custompluginfile,$c_pluginids,$c_pluginname,$c_pluginpath); } } // For security reasons init arrays here again if(!$IsCached) { $customplugin_ids = array(); $customplugin = array(); $custompluginfile = array(); $custompluginoptions = array(); $pluginids = array(); $pluginname = array(); $pluginpath = array(); } } } // ############################################################################# // LOAD PLUGINS (if not loaded from cache) // ############################################################################# if(!$IsCached) // If cache disabled or file outdated/not existing { $custom_idx = 0; // SD313 - Coded to a single statement for processing of all skin's plugin slots! // Saves up to "maxplugins - 1" individual SELECT statements if all slots are set! $extra = ''; if($DB->column_exists(PRGM_TABLE_PREFIX.'customplugins', 'ignore_excerpt_mode')) { $extra = 'c.ignore_excerpt_mode, '; } $get_pagesort = $DB->query('SELECT ps.displayorder, ps.pluginid, IF(c.custompluginid is not null, 0, 1) isplugin, IF(c.custompluginid is not null, c.custompluginid, ps.pluginid) realpluginid, IF(c.custompluginid is not null, c.displayname, p.displayname) displayname, IF(c.custompluginid is not null, \'plugins/customplugins.php\', concat(\'plugins/\',p.pluginpath)) pluginpath, c.plugin, c.includefile, '.$extra.'p.authorname FROM {pagesort} ps LEFT JOIN {plugins} p ON p.pluginid = ps.pluginid LEFT JOIN {customplugins} c ON c.custompluginid = substr(ps.pluginid,2,6) AND substr(ps.pluginid,1,1) = \'c\' WHERE ps.categoryid = %d ORDER BY ps.displayorder',PAGE_ID); for($i = 0; $i < $design_maxplugins; $i++) { // default every plugin slot to be empty $pluginids[$i] = 1; $pluginname[$i] = ''; $pluginpath[$i] = EMPTY_PLUGIN_PATH; if($pagesort_arr = $DB->fetch_array($get_pagesort,null,MYSQL_ASSOC)) { $pluginid = (int)$pagesort_arr['realpluginid']; $isCustom = (substr($pagesort_arr['pluginid'],0,1) == 'c'); if(!empty($pluginid) /*&& ($pagesort_arr['pluginid'] !== '1')*/) { $bAllowed = ( $isCustom && @in_array($pluginid, $userinfo['custompluginviewids'])) || (!$isCustom && @in_array($pluginid, $userinfo['pluginviewids'])); if(file_exists($pagesort_arr['pluginpath'])) { // IF cache is enabled, it ALWAYS stores full category layout if($SDCache && $SDCache->IsActive()) { if(empty($pagesort_arr['isplugin'])) { $c_customplugin_ids[$custom_idx] = $pagesort_arr['pluginid']; $c_customplugin[$pagesort_arr['pluginid']] = $pagesort_arr['plugin']; $c_custompluginfile[$pagesort_arr['pluginid']] = $pagesort_arr['includefile']; $c_custompluginoptions[$pagesort_arr['pluginid']]['ignore_excerpt_mode'] = !empty($pagesort_arr['ignore_excerpt_mode']); //SD342 } $c_pluginids[$i] = $pagesort_arr['pluginid']; $c_pluginname[$i] = $pagesort_arr['displayname']; $c_pluginpath[$i] = $pagesort_arr['pluginpath']; } if($isCustom) { $custom_id = $pagesort_arr['pluginid']; $customplugin_ids[$custom_idx] = $pagesort_arr['pluginid']; $customplugin[$custom_id] = $pagesort_arr['plugin']; $custompluginfile[$custom_id] = $pagesort_arr['includefile']; $custompluginoptions[$custom_id] = !empty($pagesort_arr['ignore_excerpt_mode']); //SD342 } $pluginids[$i] = $pagesort_arr['pluginid']; $pluginname[$i] = $pagesort_arr['displayname']; $pluginpath[$i] = $pagesort_arr['pluginpath']; if($isCustom) { $custom_idx++; } } } } } //for // Rewrite cache file (if enabled) if($SDCache && $SDCache->IsActive()) { $SDCache->write_var(CACHE_PAGE_PREFIX.PAGE_ID, '', array('c_categoryid' => PAGE_ID, 'c_pluginids' => $c_pluginids, 'c_pluginname' => $c_pluginname, 'c_pluginpath' => $c_pluginpath, 'c_customplugin_ids' => $c_customplugin_ids, 'c_customplugin' => $c_customplugin, 'c_custompluginfile' => $c_custompluginfile, 'c_custompluginoptions' => $c_custompluginoptions), true); } } unset($extra, $admin_menu_arr, $pluginid, $cache_file, $cache_id, $cachestamp, $get_pagesort, $pagesort_arr, $isCustom, $IsCached, $c_pluginids, $c_pluginname, $c_pluginpath, $c_customplugin_ids, $c_customplugin, $c_custompluginfile, $c_custompluginoptions, $args_pos, $do301, $last_valid_page, $last_valid_var, $last_var, $last_var_org); // ############################################################################# // PROCESS PLUGIN HEADERS (and optionally admin menu links) // ############################################################################# $edit_plugin_link_arr = array(); // Preset some frequently used variables to lessen array searches $user_custompluginviewids = $userinfo['custompluginviewids']; $user_pluginviewids = $userinfo['pluginviewids']; $IsAdmin = !empty($userinfo['loggedin']) && !empty($userinfo['adminaccess']); // SD313: Loop through plugin slots to get extra headers from plugins (header.php) // and re-evaluate view permissions if cached $custom_idx = 0; for($current_plugin_index = 0; $current_plugin_index < $design_maxplugins; $current_plugin_index++) { $pluginid = isset($pluginids[$current_plugin_index]) ? (string)$pluginids[$current_plugin_index] : '1'; $isCustom = (substr($pluginid,0,1)=='c'); $current_plugin_path = isset($pluginpath[$current_plugin_index]) ? (string)$pluginpath[$current_plugin_index] : ''; // Access is either granted for being ADMIN or has plugin view permissions: $HasAccess = //$IsAdmin || ($current_plugin_path == EMPTY_PLUGIN_PATH) || (($current_plugin_path == CUSTOMPLUGIN_PATH) && !empty($user_custompluginviewids) && @in_array(substr($pluginid,1,5), $user_custompluginviewids)) || (($current_plugin_path != CUSTOMPLUGIN_PATH) && !empty($user_pluginviewids) && @in_array($pluginid, $user_pluginviewids)); // Note: cached page contains ALL (custom) plugins, so IF plugins are loaded // from cache, reset all plugins for which the current user does not have permission! if(isset($current_plugin_path) && !$HasAccess && ($current_plugin_path != EMPTY_PLUGIN_PATH)) { if($isCustom) { $custom_id = $customplugin_ids[$custom_idx]; $customplugin[$custom_id] = ''; $custompluginfile[$custom_id] = ''; $custompluginoptions[$custom_id] = false; //SD342 $pluginname[$current_plugin_index] = ''; } else { $pluginids[$current_plugin_index] = '1'; $pluginname[$current_plugin_index] = ''; $pluginpath[$current_plugin_index] = EMPTY_PLUGIN_PATH; } } if($isCustom) { $custom_idx++; } // Check plugin-specific "header.php" file to allow inclusion of e.g. additional // CSS or JavaScript files into the header by sd_adder_head() calls: // Note: ONLY for main- and downloaded plugins! if($HasAccess && !$isCustom && isset($current_plugin_path) && ($current_plugin_path != EMPTY_PLUGIN_PATH)) { $headerfile = ROOT_PATH . dirname($pluginpath[$current_plugin_index]).'/header.php'; if(is_file($headerfile) && file_exists($headerfile)) { $pluginid = $pluginids[$current_plugin_index]; @include($headerfile); } } unset($HasAccess, $IsAdmin); // This code is only active for SD3 skins AND if the following constant is defined // (best in admin/branding.php or alternatively in includes/config.php) if(defined('DISPLAY_PLUGIN_ADMIN_SHORTCUTS') && DISPLAY_PLUGIN_ADMIN_SHORTCUTS && ($theme_arr['skin_engine'] == 2)) { if(substr($pluginids[$current_plugin_index], 0, 1) == 'c') { if(@in_array(substr($pluginids[$current_plugin_index], 1), $userinfo['custompluginadminids'])) { $edit_plugin_link_arr[$current_plugin_index] = '' . IMAGE_EDIT . ''; } } else { if(@in_array($pluginids[$current_plugin_index], $userinfo['pluginadminids'])) { if($pluginids[$current_plugin_index] > 2) { $edit_plugin_link_arr[$current_plugin_index] = ' - ' . IMAGE_EDIT . ' View Plugin'; } } } } } //for // Cleanup unset($pluginid, $isCustom, $custom_id, $current_plugin_index, $current_plugin_path, $headerfile, $user_custompluginviewids, $user_pluginviewids); // SD313: $ExtraHeader receives complete output of extra plugin headers! // This also used in "legacy_skin.php" with SD313: $ExtraHeader = ' '; sd_header_add(array('css_import' => array('ceebox'))); //SD341: "Canonical tag" for articles with URL params present if($mainsettings_modrewrite && $hasParams && $page_identified_by_SEO && @is_array($article_arr) && strlen($article_arr['seo_title'])) { $article_link = RewriteLink(); $article_link = preg_replace('#'.SD_QUOTED_URL_EXT.'$#', '/' . $article_arr['seo_title'] . $mainsettings_url_extension, $article_link); $ExtraHeader = ''.$ExtraHeader; } // Include "Markitup" as BBCode-editor - if enabled - which is at least // used by COMMENTS and Forum plugin etc. if(!empty($mainsettings_allow_bbcode)) { if(defined('ENABLE_MINIFY') && ENABLE_MINIFY) { sd_header_add(array('js' => array(SD_INCLUDE_PATH.'min/index.php?g=bbcode'))); } else { sd_header_add(array('js' => array(SD_JS_PATH . 'markitup/markitup-full.js',))); } } $ExtraHeader .= sd_header_flush(false); // ******* Include JS for Ajax-rating ******* $ExtraHeader .= GetRatingsHandlingJS(); // ############################################################################# // LOAD LAYOUT AND BUILD HOVER MENU (IF NEEDED) // ############################################################################# $menu_header = ''; $pages_menu = CreateMenu(); $breadcrumb = CreateBreadcrumb(PAGE_ID); $pages_menu_top = CreateMenu(0, true); $pages_menu_sub = CreateMenu(PAGE_ID); // SD 3.3.2 - new for SUBNAVIGATION $pages_toplevel_nomenu = CreateMenu(0, true, true); // SD 3.3.2 - new $cms_head_include = '\n" . '\n" . '\n" . '\n" . '' . $mainsettings_websitetitle . "\n" . $rss_link . ''."\n" ;//. ''."\n"; if(defined('ENABLE_MINIFY') && ENABLE_MINIFY) { $cms_head_include .= ''; } else { $cms_head_include .= ''; } $cms_head_nomenu = $cms_head_include . $ExtraHeader; // SD 3.3.2 - new for CMS_HEAD_NOMENU: head excluding menu JS // is there a hover menu involved? $HoverNeeded = isset($sd_cache['category_parents']) ? (count($sd_cache['category_parents']) > 1) : $DB->query_first('SELECT categoryid FROM {categories} WHERE parentid != 0 LIMIT 1'); if($HoverNeeded) { //SD322: preliminary minify support if(defined('ENABLE_MINIFY') && ENABLE_MINIFY) { $menu_header = "\n".''; } else { $menu_header = "\n" . '' . "\n" . '' . "\n" . '' . "\n" . '' . "\n"; } $menu_header .= "\n".$mainsettings_frontpage_menu_javascript; } $cms_head_include .= $menu_header . $ExtraHeader; if($theme_arr['skin_engine'] == 2) // SD3-specific, xml-based skin { // Replace required skin placeholders with actual value // SD 3.3.2 - testing for Max // added SUBNAVIGATION and CMS_HEADER_NOMENU $replace_search = array('[HEADER]','[FOOTER]','[NAVIGATION]','[BREADCRUMB]','[NAVIGATION-TOPLEVEL]','[NAVIGATION-TOPLEVEL-NOMENU]','[SUBNAVIGATION]','[LOGO]','[CMS_HEAD_INCLUDE]','[CMS_HEAD_NOMENU]','[COPYRIGHT]','[PAGE_TITLE]','[PAGE_NAME]'); $replace_values = array($theme_arr['header'],$theme_arr['footer'],$pages_menu,$breadcrumb,$pages_menu_top,$pages_toplevel_nomenu,$pages_menu_sub,$mainsettings_currentlogo,$cms_head_include,$cms_head_nomenu,$copyright,$theme_arr['title'],$theme_arr['categoryname']); $theme_arr['layout'] = str_replace($replace_search, $replace_values, $theme_arr['layout']); $current_layout = &$theme_arr['layout']; // Cleanup unset($menu_header,$cms_head_include,$cms_head_nomenu,$ExtraHeader,$replace_values,$replace_search,$c_categoryid,$last_var, $custom_idx,$HoverNeeded,$pages_menu,$pages_menu_top,$pages_menu_sub,$user_has_categories, $sub_folders,$url_variables,$get_designs,$active_skin_id,$admin_menu_arr,$args_pos,$pid); // cycle through all the plugins // step 1: check if each plugin has plugin_name tags // if so then replace the tags with the plugin name // step 2: remove the plugin tags for($current_plugin_index = 0; $current_plugin_index < $design_maxplugins; $current_plugin_index++) { // STEP 1: does current have plugin_name tags? // search for starting plugin tag $plugin_open_tag_pos = strpos($current_layout, ''); // search for ending plugin tag $plugin_close_tag_pos = strpos($current_layout, ''); // okay now we know where current plugin is located, does it have a plugin name? // last @argument for substr_count = the length of characters to grab // (which happens to be "plugin_close_tag_pos - plugin_open_tag_pos +9" // the + 13 represents the extra "" characters // SD322: replace substr_count with substr/strpos and $tmp variable due to // problems with previously used "substr_count" $tmp = substr($current_layout, $plugin_open_tag_pos, ($plugin_close_tag_pos - $plugin_open_tag_pos + 13)); if(@strpos($tmp, '') !== false) { // plugin name found, wonderful, now lets remove the plugin name tags if(isset($pluginname[$current_plugin_index]) && strlen($pluginname[$current_plugin_index])) { // there is a plugin name, so only remove the FIRST pair of plugin_name tags // we are left with something like

[PLUGIN_NAME]

$current_layout = preg_replace("''", '', $current_layout, 1); $current_layout = preg_replace("''", '', $current_layout, 1); } else { // There is no plugin name, so remove the plugin_name tags and all code between // them and then replace it with [PLUGIN_NAME], which eventually will be // replaced by an empty string. $current_layout = preg_replace("'(.*?)'ms", '[PLUGIN_NAME]', $current_layout, 1); } // Now check if the variable actually exists. // For example, a skin author might have written this code: //

hello world

// So lets definitely make sure it exists before trying to replace it // and then replace it with a real name. // SD322: replace substr_count with substr/strpos and $tmp variable $tmp = substr($current_layout, $plugin_open_tag_pos, ($plugin_close_tag_pos - $plugin_open_tag_pos + 13)); if(@strpos($tmp, '[PLUGIN_NAME]') !== false) { $ptitle = isset($pluginname[$current_plugin_index]) ? $pluginname[$current_plugin_index] : ''; // it was found, lets replace it with the plugin name $current_layout = preg_replace('/\[PLUGIN_NAME\]/', $ptitle, $current_layout, 1); } } unset($tmp,$ptitle); // STEP 2: remove tags if($pluginpath[$current_plugin_index] == EMPTY_PLUGIN_PATH) { // plugin is empty, remove the plugin tags and everything in between them // then replace it with [PLUGIN] $current_layout = preg_replace("'(.*?)'ms", '[PLUGIN]', $current_layout, 1); } else { // A plugin exists, so remove the plugin tags (a single pair) $current_layout = preg_replace("''", '', $current_layout, 1); $current_layout = preg_replace("''", '', $current_layout, 1); } } // SD313 - clean up all unused variables unset($admin_menu_arr, $bAllowed, $category, $column_name, $column_value, $current_plugin_index, $get_plugins, $headerfile, $i, $replace_search, $user_arr); //SD330: check for placeholders in skin layout $current_layout = preg_replace_callback('/\[([^\s\]:]*):([^\s\]]*):([^\s\]]*)\]/', 'CheckLayoutReplacements', $current_layout); // okay the layout is ready to be exploded, lets split it up into an array $layout_arr = explode('[PLUGIN]', $current_layout); unset($current_layout); // SD313: shouldn't we add this to categories table since many plugins // use this for sizing input fields correctly?? $inputsize = '30'; // legacy - default "input" width (characters) // display layout $current_page_url = RewriteLink('index.php?categoryid='.PAGE_ID); //SD342 for($layout_index = 0; $layout_index < count($layout_arr); $layout_index++) { // "$layout_arr[$layout_arr]" contains skin code between previous (or start of skin) // and the currently loading plugin, which is eval'ed to both output skin HTML // as well as process included PHP code: if(is_array($layout_arr) && strlen($layout_arr[$layout_index])) { $layout_arr[$layout_index] = ' ?>' . $layout_arr[$layout_index] . 'conn) { $DB->close(); }