define('ROOT','../..');
define('TATTERTOOLS_NAME','Tattertools');
define('TATTERTOOLS_VERSION','1.0.6.1');
define('TATTERTOOLS_COPYRIGHT','Copyright © 2004-2006, Tatter & Company');
define('TATTERTOOLS_HOMEPAGE','http://www.tattertools.com/');
define('TATTERTOOLS_SYNC_URL','http://sync.eolin.com/');
define('CRLF',"\r\n");
$database['server']='localhost';
$database['database']='';
$database['username']='';
$database['password']='';
$database['prefix']='';
$service['timeout']=3600;
$service['type']='single';
$service['domain']='';
$service['path']='';
$service['language']='ko';
$service['timezone']='Asia/Seoul';
$service['encoding']='EUC-KR';
$service['umask']=0;
$service['skin']='Tattertools_skyline_ko';
if(@is_numeric($_SERVER['SERVER_PORT'])&&($_SERVER['SERVER_PORT']!=80)&&($_SERVER['SERVER_PORT']!=443))
$service['port']=$_SERVER['SERVER_PORT'];
function requireComponent($name){
if(!ereg('^[[:alnum:]]+[[:alnum:].]+$',$name))
return ;
include_once ("../../components/$name.php");
}
requireComponent('Eolin.PHP.UnifiedEnvironment');
requireComponent('Eolin.PHP.Core');
requireComponent('Tattertools.Core');
requireComponent('Tattertools.Core.BackwardCompatibility');
include_once '../../config.php';
function checkPeriod($period){
if(is_numeric($period)){
$year=0;
$month=1;
$day=1;
switch(strlen($period)){
case 8:
$day=substr($period,6,2);
case 6:
$month=substr($period,4,2);
case 4:
$year=substr($period,0,4);
return checkdate($month,$day,$year);
}
}
return false;
}
function getTimeFromPeriod($period){
if(is_numeric($period)){
$year=0;
$month=1;
$day=1;
switch(strlen($period)){
case 8:
$day=substr($period,6,2);
case 6:
$month=substr($period,4,2);
case 4:
$year=substr($period,0,4);
if(checkdate($month,$day,$year))
return mktime(0,0,0,$month,$day,$year);
}
}
return false;
}
function addPeriod($period,$inc=1){
if(checkPeriod($period)!==false){
switch(strlen($period)){
case 4:
return strftime('%Y',mktime(0,0,0,1,1,$period+$inc));
case 6:
return strftime('%Y%m',mktime(0,0,0,substr($period,4)+$inc,1,substr($period,0,4)));
case 8:
return strftime('%Y%m%d',mktime(0,0,0,substr($period,4,2),substr($period,6,2)+$inc,substr($period,0,4)));
}
}
return false;
}
function getPeriodLabel($period){
$name=strval($period);
switch(strlen($name)){
case 4:
return $name;
case 6:
return substr($name,0,4).'/'.substr($name,4);
case 8:
return substr($name,0,4).'/'.substr($name,4,2).'/'.substr($name,6).'';
}
}
function escapeJSInAttribute($str){
return htmlspecialchars(str_replace(array('\\','\r','\n','\''),array('\\\\','\\r','\\n','\\\''),$str));
}
function escapeJSInCData($str){
return preg_replace(array('/','/>/','/\r*\n|\r/'),array('\x3C','\x3E','\\\\$0'),addslashes($str));
}
function addLinkSense($text,$attributes=''){
return ereg_replace("(^| |\t|\r|\n|\"|')(http://[^ \t\r\n\"']+)","\\1\\2",$text);
}
function addProtocolSense($url,$protocol='http://'){
return ereg('^[[:alnum:]]+:',$url)?$url:$protocol.$url;
}
function fetchQueryAll($query,$type=MYSQL_BOTH){
$rows=array();
if($result=mysql_query($query)){
while($row=mysql_fetch_array($result,$type))
array_push($rows,$row);
mysql_free_result($result);
}
return $rows;
}
function fetchQueryRow($query){
if($result=mysql_query($query)){
if($row=mysql_fetch_array($result)){
mysql_free_result($result);
return $row;
}
mysql_free_result($result);
}
return ;
}
function fetchQueryColumn($query){
$column=array();
if($result=mysql_query($query)){
while($row=mysql_fetch_row($result))
array_push($column,$row[0]);
mysql_free_result($result);
}
return $column;
}
function fetchQueryCell($query){
if($result=mysql_query($query)){
list($cell)=mysql_fetch_row($result);
mysql_free_result($result);
return $cell;
}
return ;
}
function executeQuery($query){
return mysql_query($query)?true:false;
}
mysql_connect($database['server'],$database['username'],$database['password']);
mysql_select_db($database['database']);
if(mysql_query('SET CHARACTER SET utf8')){
$database['utf8']=true;
}else{
$database['utf8']=false;
function mysql_lessen($str,$length=255,$tail='..'){
return UTF8::lessenAsByte($str,$length,$tail);
}
}
@mysql_query('SET SESSION collation_connection = \'utf8_general_ci\'');
function getOwner($name){
global $database;
return fetchQueryCell("select owner from {$database['prefix']}BlogSettings where name = '$name'");
}
function getOwnerBySecondaryDomain($domain){
global $database;
return fetchQueryCell("select owner from {$database['prefix']}BlogSettings where secondaryDomain = '$domain'");
}
function getBlogSetting($owner){
global $database;
if($result=mysql_query("select * from {$database['prefix']}BlogSettings where owner = $owner")){
return mysql_fetch_array($result);
}
return false;
}
function getSkinSetting($owner){
global $database;
if($result=mysql_query("select * from {$database['prefix']}SkinSettings where owner = $owner"))
return mysql_fetch_array($result);
return false;
}
function getBlogURL($name=null,$domain=null,$path=null,$type=null){
global $service,$blog;
if($type===null)
$type=$service['type'];
if($path===null)
$path=$service['path'];
if($domain===null)
$domain=$service['domain'].(isset($service['port'])?":{$service['port']}":'');
if($name===null)
$name=$blog['name'];
switch($type){
case 'domain':
return "http://$name.$domain$path";
case 'path':
return "http://$domain$path/$name";
case 'single':
default:
return "http://$domain$path";
}
}
function getArchives($owner){
global $database;
$archives=array();
$visibility=doesHaveOwnership()?'':'AND visibility > 0';
$result=mysql_query("SELECT EXTRACT(year_month FROM FROM_UNIXTIME(published)) period, COUNT(*) count FROM {$database['prefix']}Entries WHERE owner = $owner AND draft = 0 $visibility AND category >= 0 GROUP BY period ORDER BY period DESC LIMIT 5");
if($result){
while($archive=mysql_fetch_array($result))
array_push($archives,$archive);
}
return $archives;
}
function getCalendar($owner,$period){
global $database;
$calendar=array('days'=>array());
if(($period===true)||!checkPeriod($period))
$period=Timestamp::getYearMonth();
$calendar['period']=$period;
$calendar['year']=substr($period,0,4);
$calendar['month']=substr($period,4,2);
$visibility=doesHaveOwnership()?'':'AND visibility > 0';
$result=mysql_query("SELECT DISTINCT DAYOFMONTH(FROM_UNIXTIME(published)) FROM {$database['prefix']}Entries WHERE owner = $owner AND draft = 0 $visibility AND category >= 0 AND YEAR(FROM_UNIXTIME(published)) = {$calendar['year']} AND MONTH(FROM_UNIXTIME(published)) = {$calendar['month']}");
if($result){
while(list($day)=mysql_fetch_array($result))
array_push($calendar['days'],$day);
}
$calendar['days']=array_flip($calendar['days']);
return $calendar;
}
function getCategories($owner){
global $database;
$rows=fetchQueryAll("SELECT * FROM {$database['prefix']}Categories WHERE owner = $owner ORDER BY parent, priority");
$categories=array();
foreach($rows as $category){
if($category['parent']==null){
$category['children']=array();
$categories[$category['id']]=$category;
}elseif(isset($categories[$category['parent']]))
array_push($categories[$category['parent']]['children'],$category);
}
return $categories;
}
function getCategoriesSkin(){
global $database;
global $owner,$service;
$sql="select * from {$database['prefix']}SkinSettings where owner = $owner";
$setting=fetchQueryRow($sql);
$skin=array('name'=>"{$setting['skin']}",'url'=>$service['path']."/image/tree/{$setting['tree']}",'labelLength'=>$setting['labelLengthOnTree'],'showValue'=>$setting['showValueOnTree'],'bgColor'=>"{$setting['bgColorOnTree']}",'itemColor'=>"{$setting['colorOnTree']}",'itemBgColor'=>"{$setting['bgColorOnTree']}",'activeItemColor'=>"{$setting['activeColorOnTree']}",'activeItemBgColor'=>"{$setting['activeBgColorOnTree']}",);
return $skin;
}
function getCommentsWithPagingForGuestbook($owner,$page,$count){
global $database;
$sql="SELECT * FROM {$database['prefix']}Comments WHERE owner = $owner";
$sql.=' AND entry = 0 AND parent is null';
$sql.=' ORDER BY written DESC';
return fetchWithPaging($sql,$page,$count);
}
function getComments($entry){
global $database,$owner;
$comments=array();
$authorized=doesHaveOwnership();
$aux=($entry==0?'ORDER BY written DESC':'order by id ASC');
$sql="select * from {$database['prefix']}Comments where owner = $owner and entry = $entry and parent is null $aux";
if($result=mysql_query($sql)){
while($comment=mysql_fetch_array($result)){
if(($comment['secret']==1)&&!$authorized){
$comment['name']='';
$comment['homepage']='';
$comment['comment']=_t('관리자만 볼 수 있는 댓글입니다');
}
array_push($comments,$comment);
}
}
return $comments;
}
function getCommentComments($parent){
global $database,$owner;
$comments=array();
$authorized=doesHaveOwnership();
if($result=mysql_query("select * from {$database['prefix']}Comments where owner = $owner and parent = $parent order by id")){
while($comment=mysql_fetch_array($result)){
if(($comment['secret']==1)&&!$authorized){
$comment['name']='';
$comment['homepage']='';
$comment['comment']=_t('관리자만 볼 수 있는 댓글입니다');
}
array_push($comments,$comment);
}
}
return $comments;
}
function getRecentComments($owner){
global $skinSetting,$database;
$comments=array();
$sql=doesHaveOwnership()?"SELECT * FROM {$database['prefix']}Comments WHERE owner = $owner AND entry>0 ORDER BY written DESC LIMIT {$skinSetting['commentsOnRecent']}":"SELECT r.* FROM {$database['prefix']}Comments r, {$database['prefix']}Entries e WHERE r.owner = $owner AND r.owner = e.owner AND r.entry = e.id AND e.draft = 0 AND e.visibility > 0 AND entry > 0 ORDER BY r.written DESC LIMIT {$skinSetting['commentsOnRecent']}";
if($result=mysql_query($sql)){
while($comment=mysql_fetch_array($result)){
if(($comment['secret']==1)&&!doesHaveOwnership()){
$comment['name']='';
$comment['homepage']='';
$comment['comment']=_t('관리자만 볼 수 있는 댓글입니다');
}
array_push($comments,$comment);
}
}
return $comments;
}
function notifyComment(){
global $database,$owner,$service,$blog,$hostURL;
$blogURL=$hostURL.($service['type']=='path'?"{$service['path']}/{$blog['name']}":$service['path']);
$sql="
select
CN.*,
CNQ.id AS queueId,
CNQ.commentId AS commentId,
CNQ.sendStatus AS sendStatus,
CNQ.checkDate AS checkDate,
CNQ.written AS queueWritten
from
{$database['prefix']}CommentsNotifiedQueue AS CNQ
LEFT JOIN
{$database['prefix']}Comments AS CN ON CNQ.commentId = CN.id
where
CNQ.sendStatus = '0'
and CN.parent is not null
ORDER BY CNQ.id ASC
limit 0, 1
";
$queue=fetchQueryRow($sql);
if(empty($queue)&&empty($queue['queueId'])){
executeQuery("DELETE FROM `{$database['prefix']}CommentsNotifiedQueue` WHERE `id`={$queue['queueId']}");
return false;
}
$comments=(fetchQueryRow("SELECT * FROM {$database['prefix']}Comments WHERE owner = $owner AND id = {$queue['commentId']}"));
if(empty($comments['parent'])||$comments['secret']==1){
executeQuery("DELETE FROM `{$database['prefix']}CommentsNotifiedQueue` WHERE `id`={$queue['queueId']}");
return false;
}
$parentComments=(fetchQueryRow("SELECT * FROM {$database['prefix']}Comments WHERE owner = $owner AND id = {$comments['parent']}"));
if(empty($parentComments['homepage'])){
executeQuery("DELETE FROM `{$database['prefix']}CommentsNotifiedQueue` WHERE `id`={$queue['queueId']}");
return false;
}
$entry=(fetchQueryRow("SELECT * FROM {$database['prefix']}Entries WHERE owner = $owner AND id={$comments['entry']}"));
$data="url=".rawurlencode($blogURL)."&mode=fb"."&s_home_title=".rawurlencode($blog['title'])."&s_post_title=".rawurlencode($entry['title'])."&s_name=".rawurlencode($comments['name'])."&s_no=".rawurlencode($comments['entry'])."&s_url=".rawurlencode("$blogURL/".($blog['useSlogan']?"entry/{$entry['slogan']}":$entry['id']))."&r1_name=".rawurlencode($parentComments['name'])."&r1_no=".rawurlencode($parentComments['id'])."&r1_pno=".rawurlencode($comments['entry'])."&r1_rno=0"."&r1_homepage=".rawurlencode($parentComments['homepage'])."&r1_regdate=".rawurlencode($parentComments['written'])."&r1_url=".rawurlencode("$blogURL/".($blog['useSlogan']?"entry/{$entry['slogan']}":$entry['id'])."#comment".$parentComments['id'])."&r2_name=".rawurlencode($comments['name'])."&r2_no=".rawurlencode($comments['id'])."&r2_pno=".rawurlencode($comments['entry'])."&r2_rno=".rawurlencode($comments['parent'])."&r2_homepage=".rawurlencode($comments['homepage'])."&r2_regdate=".rawurlencode($comments['written'])."&r2_url=".rawurlencode("$blogURL/".($blog['useSlogan']?"entry/{$entry['slogan']}":$entry['id'])."#comment".$comments['id'])."&r1_body=".rawurlencode($parentComments['comment'])."&r2_body=".rawurlencode($comments['comment']);
requireComponent('Eolin.PHP.HTTPRequest');
if(strpos($parentComments['homepage'],"http://")===false){
$homepage='http://'.$parentComments['homepage'];
}else{
$homepage=$parentComments['homepage'];
}
$request=new HTTPRequest('POST',$homepage);
$request->contentType='application/x-www-form-urlencoded; charset=utf-8';
$request->content=$data;
if($request->send()){
$xmls=new XMLStruct();
if($xmls->open($request->responseText)){
$result=$xmls->selectNode('/response/error/');
if($result['.value']!='1'&&$result['.value']!='0'){
$homepage=rtrim($homepage,'/').'/index.php';
$request=new HTTPRequest('POST',$homepage);
$request->contentType='application/x-www-form-urlencoded; charset=utf-8';
$request->content=$data;
if($request->send()){
}
}
}
}else{
}
executeQuery("DELETE FROM `{$database['prefix']}CommentsNotifiedQueue` WHERE `id`={$queue['queueId']}");
}
function getEntriesTotalCount($owner){
global $database;
$visibility=doesHaveOwnership()?'':'AND visibility > 0';
return fetchQueryCell("SELECT COUNT(*) FROM {$database['prefix']}Entries WHERE owner = $owner AND draft = 0 $visibility AND category >= 0");
}
function getRecentEntries($owner){
global $database,$skinSetting;
$entries=array();
$visibility=doesHaveOwnership()?'':'AND visibility > 0';
$result=mysql_query("SELECT id, title, comments FROM {$database['prefix']}Entries WHERE owner = $owner AND draft = 0 $visibility AND category >= 0 ORDER BY published DESC LIMIT {$skinSetting['entriesOnRecent']}");
while($entry=mysql_fetch_array($result)){
array_push($entries,$entry);
}
return $entries;
}
function isFiltered($owner,$mode,$value){
global $database;
$value=mysql_escape_string($value);
switch($mode){
case 'sitename':
$table='URLFilters';
$column='url';
$value=str_replace('http://','',$value);
$lastSlashPos=lastIndexOf($value,'/');
if($lastSlashPos>-1){
$value=substr($value,0,$lastSlashPos);
}
break;
case 'name':
$table='GuestFilters';
$column='name';
break;
case 'address':
$table='HostFilters';
$column='address';
break;
case 'contents':
$table='ContentFilters';
$column='word';
break;
default:
return false;
}
if($mode=='contents'){
$result=mysql_query("select $column from {$database['prefix']}$table WHERE owner = $owner");
while($row=mysql_fetch_row($result)){
if(eregi($row[0],$value)){
return true;
}
}
return false;
}else{
return mysql_result(mysql_query("select count(*) from {$database['prefix']}$table WHERE owner = $owner AND $column = '$value'"),0,0);
}
}
function getNotices($owner){
global $database;
$visibility=doesHaveOwnership()?'':'AND visibility = 2';
return fetchQueryAll("SELECT id, title, published FROM {$database['prefix']}Entries WHERE owner = $owner AND draft = 0 $visibility AND category = -2 ORDER BY published DESC");
}
function getLinks($owner){
global $database;
$links=array();
if($result=mysql_query("select * from {$database['prefix']}Links where owner = $owner ORDER BY name")){
while($link=mysql_fetch_array($result))
array_push($links,$link);
}
return $links;
}
function fetchWithPaging($sql,$page,$count,$url=null,$prefix='?page='){
global $folderURL;
if($url===null)
$url=$folderURL;
$paging=array('url'=>$url,'prefix'=>$prefix,'postfix'=>'');
if(empty($sql))
return array(array(),$paging);
if(eregi('[[:space:]]{1}(FROM.*)$',$sql,$matches))
$from=$matches[1];
else
return array(array(),$paging);
$paging['total']=fetchQueryCell("SELECT COUNT(*) $from");
if($paging['total']===null)
return array(array(),$paging);
$paging['pages']=intval(ceil($paging['total']/$count));
$paging['page']=is_numeric($page)?$page:1;
if($paging['page']>$paging['pages']){
$paging['page']=$paging['pages']+1;
if($paging['pages']>0)
$paging['prev']=$paging['pages'];
return array(array(),$paging);
}
if($paging['page']>1)
$paging['prev']=$paging['page']-1;
if($paging['page']<$paging['pages'])
$paging['next']=$paging['page']+1;
$offset=($paging['page']-1)*$count;
return array(fetchQueryAll("$sql LIMIT $offset, $count"),$paging);
}
function getStatistics($owner){
global $database;
$stats=array('total'=>0,'today'=>0,'yesterday'=>0);
$result=mysql_query("select visits from {$database['prefix']}BlogStatistics where owner = $owner");
if(mysql_num_rows($result)==1)
list($stats['total'])=mysql_fetch_array($result);
$result=mysql_query("select visits from {$database['prefix']}DailyStatistics where owner = $owner and `date` = ".Timestamp::getDate());
if(mysql_num_rows($result)==1)
list($stats['today'])=mysql_fetch_array($result);
$result=mysql_query("select visits from {$database['prefix']}DailyStatistics where owner = $owner and `date` = ".Timestamp::getDate(time()-86400));
if(mysql_num_rows($result)==1)
list($stats['yesterday'])=mysql_fetch_array($result);
return $stats;
}
function updateVisitorStatistics($owner){
global $database,$blogURL;
if(!fireEvent('UpdatingVisitorStatistics',true))
return ;
if(doesHaveOwnership())
return ;
$id=session_id();
$result=mysql_query("select blog from {$database['prefix']}SessionVisits where id = '$id' and address = '{$_SERVER['REMOTE_ADDR']}' and blog = $owner");
if($result&&(mysql_num_rows($result)>0))
return ;
if(mysql_query("insert into {$database['prefix']}SessionVisits values('$id', '{$_SERVER['REMOTE_ADDR']}', $owner)")&&(mysql_affected_rows()>0)){
mysql_query("update {$database['prefix']}BlogStatistics set visits = visits + 1 where owner = $owner");
if(mysql_affected_rows()==0){
if(mysql_query("update {$database['prefix']}BlogStatistics set visits = visits + 1 where owner = $owner")||(mysql_affected_rows()==0))
mysql_query("insert into {$database['prefix']}BlogStatistics values($owner, 1)");
}
$period=Timestamp::getDate();
mysql_query("update {$database['prefix']}DailyStatistics set visits = visits + 1 where owner = $owner and `date` = $period");
if(mysql_affected_rows()==0){
if(!mysql_query("insert into {$database['prefix']}DailyStatistics values($owner, $period, 1)")||(mysql_affected_rows()==0))
mysql_query("update {$database['prefix']}DailyStatistics set visits = visits + 1 where owner = $owner and `date` = $period");
}
if(!empty($_SERVER['HTTP_REFERER'])){
$referer=parse_url($_SERVER['HTTP_REFERER']);
if(!empty($referer['host'])&&(($referer['host']!=$_SERVER['HTTP_HOST'])||(strncmp($referer['path'],$blogURL,strlen($blogURL))!=0))){
requireComponent('Tattertools.Data.Filter');
if(Filter::isFiltered('ip',$_SERVER['REMOTE_ADDR'])||Filter::isFiltered('url',$_SERVER['HTTP_REFERER']))
return ;
if(!fireEvent('AddingRefererLog',true,array('host'=>$referer['host'],'url'=>$_SERVER['HTTP_REFERER'])))
return ;
$host=mysql_escape_string($referer['host']);
$url=mysql_escape_string($_SERVER['HTTP_REFERER']);
mysql_query("insert into {$database['prefix']}RefererLogs values($owner, '$host', '$url', UNIX_TIMESTAMP())");
mysql_query("delete from {$database['prefix']}RefererLogs where referred < UNIX_TIMESTAMP() - 604800");
if(!mysql_query("update {$database['prefix']}RefererStatistics set count = count + 1 where owner = $owner and host = '$host'")||(mysql_affected_rows()==0))
mysql_query("insert into {$database['prefix']}RefererStatistics values($owner, '$host', 1)");
}
}
}
}
function getRecentTrackbacks($owner){
global $database;
global $skinSetting;
$trackbacks=array();
$sql=doesHaveOwnership()?"SELECT * FROM {$database['prefix']}Trackbacks WHERE owner = $owner ORDER BY written DESC LIMIT {$skinSetting['trackbacksOnRecent']}":"SELECT t.* FROM {$database['prefix']}Trackbacks t, {$database['prefix']}Entries e WHERE t.owner = $owner AND t.owner = e.owner AND t.entry = e.id AND e.draft = 0 AND e.visibility >= 2 ORDER BY t.written DESC LIMIT {$skinSetting['trackbacksOnRecent']}";
if($result=mysql_query($sql)){
while($trackback=mysql_fetch_array($result))
array_push($trackbacks,$trackback);
}
return $trackbacks;
}
function lastIndexOf($string,$item){
$index=strpos(strrev($string),strrev($item));
if($index){
$index=strlen($string)-strlen($item)-$index;
return $index;
}else
return -1;
}
function getRandomTags($owner){
global $database,$skinSetting;
$tags=array();
$aux=($skinSetting['tagsOnTagbox']==-1)?'':"limit {$skinSetting['tagsOnTagbox']}";
if($skinSetting['tagboxAlign']==1)
$result=mysql_query("select name, count(*) cnt from {$database['prefix']}Tags, {$database['prefix']}TagRelations where id = tag and owner = $owner GROUP BY name ORDER BY cnt DESC $aux");
elseif($skinSetting['tagboxAlign']==2)
$result=mysql_query("select distinct name from {$database['prefix']}Tags, {$database['prefix']}TagRelations where id = tag and owner = $owner ORDER BY name $aux");
else
$result=mysql_query("select name from {$database['prefix']}Tags, {$database['prefix']}TagRelations where id = tag and owner = $owner GROUP BY name ORDER BY RAND() $aux");
if($result){
while(list($tag)=mysql_fetch_row($result))
array_push($tags,$tag);
}
return $tags;
}
function getTagFrequencyRange(){
global $database,$owner;
$max=$min=0;
$result=mysql_query("select count(entry) cnt from {$database['prefix']}TagRelations where owner = $owner group by tag order by cnt desc limit 1");
if($result){
if(list($count)=mysql_fetch_array($result))
$max=$count;
}
$result=mysql_query("select count(entry) cnt from {$database['prefix']}TagRelations where owner = $owner group by tag order by cnt limit 1");
if($result){
if(list($count)=mysql_fetch_array($result))
$min=$count;
}
return array($max,$min);
}
function getTagFrequency($tag,$max,$min){
global $database,$owner;
$count=fetchQueryCell("select count(*) from {$database['prefix']}Tags t, {$database['prefix']}TagRelations r where t.id=r.tag and r.owner = $owner and t.name = '".mysql_escape_string($tag)."'");
$dist=$max/3;
if($count==$min)
return 5;
elseif($count==$max)
return 1;
elseif($count>=$min+($dist*2))
return 2;
elseif($count>=$min+$dist)
return 3;
else
return 4;
}
$url=isset($_SERVER['REDIRECT_URL'])?$_SERVER['REDIRECT_URL']:$_SERVER['SCRIPT_NAME'];
$suri=array('url'=>$url,'value'=>'');
$owner=null;
$depth=substr_count($service['path'],'/');
if($depth>0){
if(ereg("^((/+[^/]+){{$depth}})(.*)$",$url,$matches))
$url=$matches[3];
else
respondNotFoundPage();
}
if($service['type']=='single'){
$owner=1;
}else{
if($service['type']=='domain'){
if($_SERVER['HTTP_HOST']==$service['domain']){
$owner=1;
}else{
$domain=explode('.',$_SERVER['HTTP_HOST'],2);
if($domain[1]==$service['domain']){
$owner=getOwner($domain[0]);
if($owner===null)
$owner=getOwnerBySecondaryDomain($_SERVER['HTTP_HOST']);
}else{
$owner=getOwnerBySecondaryDomain($_SERVER['HTTP_HOST']);
}
}
}else{
if($url=='/'){
$owner=1;
}elseif(ereg('^/+([^/]+)(.*)$',$url,$matches)){
$owner=getOwner($matches[1]);
$url=$matches[2];
}else{
respondNotFoundPage();
}
}
if($owner===null)
respondNotFoundPage();
}
$blog=getBlogSetting($owner);
$skinSetting=getSkinSetting($owner);
$depth=substr_count(ROOT,'/');
if($depth>0){
if(ereg("^((/+[^/]+){{$depth}})/*(.*)$",$url,$matches)){
$suri['directive']=$matches[1];
if($matches[3]!==false)
$suri['value']=$matches[3];
}else
respondNotFoundPage();
}else{
$suri['directive']='/';
$suri['value']=ltrim($url,'/');
}
if(is_numeric($suri['value']))
$suri['id']=$suri['value'];
$suri['page']=empty($_POST['page'])?(empty($_GET['page'])?true:$_GET['page']):$_POST['page'];
$hostURL="http://{$_SERVER['HTTP_HOST']}".(isset($service['port'])?":{$service['port']}":'');
$blogURL=$service['type']=='path'?"{$service['path']}/{$blog['name']}":$service['path'];
$folderURL=rtrim($blogURL.$suri['directive'],'/');
unset($url,$domain);
if(!file_exists('../../config.php')){
header("Location: $blogURL/setup.php");
exit;
}
function respondNotFoundPage(){
header('HTTP/1.1 404 Not Found');
header("Connection: close");
exit;
}
function getMicrotimeAsFloat(){
list($usec,$sec)=explode(" ",microtime());
return ($usec+$sec);
}
$sessionMicrotime=getMicrotimeAsFloat();
function openSession($savePath,$sessionName){
return true;
}
function closeSession(){
return true;
}
function readSession($id){
global $database,$service;
if($result=mysql_query("SELECT data FROM {$database['prefix']}Sessions WHERE id = '$id' AND address = '{$_SERVER['REMOTE_ADDR']}' AND updated >= (UNIX_TIMESTAMP() - {$service['timeout']})")){
if($session=mysql_fetch_array($result))
return $session['data'];
}
return '';
}
function writeSession($id,$data){
global $database;
global $sessionMicrotime;
if(strlen($id)<32)
return false;
$userid=isset($_SESSION['userid'])?$_SESSION['userid']:'null';
$data=mysql_escape_string($data);
$server=mysql_escape_string($_SERVER['HTTP_HOST']);
$request=mysql_escape_string($_SERVER['REQUEST_URI']);
$referer=isset($_SERVER['HTTP_REFERER'])?mysql_escape_string($_SERVER['HTTP_REFERER']):'';
$timer=getMicrotimeAsFloat()-$sessionMicrotime;
$result=mysql_query("UPDATE {$database['prefix']}Sessions SET userid = $userid, data = '$data', server = '$server', request = '$request', referer = '$referer', timer = $timer, updated = UNIX_TIMESTAMP() WHERE id = '$id' AND address = '{$_SERVER['REMOTE_ADDR']}'");
if($result&&(mysql_affected_rows()==1))
return true;
return false;
}
function destroySession($id,$setCookie=false){
global $database;
if(!isset($_SESSION['userid']))
return ;
@mysql_query("DELETE FROM {$database['prefix']}Sessions WHERE id = '$id' AND address = '{$_SERVER['REMOTE_ADDR']}'");
gcSession();
}
function gcSession($maxLifeTime=false){
global $database,$service;
@mysql_query("DELETE FROM {$database['prefix']}Sessions WHERE updated < (UNIX_TIMESTAMP() - {$service['timeout']})");
$result=@mysql_query("SELECT DISTINCT v.id, v.address FROM {$database['prefix']}SessionVisits v LEFT JOIN {$database['prefix']}Sessions s ON v.id = s.id AND v.address = s.address WHERE s.id IS NULL AND s.address IS NULL");
if($result){
$gc=array();
while($g=mysql_fetch_row($result))
array_push($gc,$g);
foreach($gc as $g)
@mysql_query("DELETE FROM {$database['prefix']}SessionVisits WHERE id = '{$g[0]}' AND address = '{$g[1]}'");
}
return true;
}
function getAnonymousSession(){
global $database;
$result=mysql_query("SELECT id FROM {$database['prefix']}Sessions WHERE address = '{$_SERVER['REMOTE_ADDR']}' AND userid IS NULL AND preexistence IS NULL");
if($result&&(list($id)=mysql_fetch_array($result)))
return $id;
return false;
}
function newAnonymousSession(){
global $database;
for($i=0;$i<100;$i++){
if(($id=getAnonymousSession())!==false)
return $id;
$id=dechex(rand(0x10000000,0x7FFFFFFF)).dechex(rand(0x10000000,0x7FFFFFFF)).dechex(rand(0x10000000,0x7FFFFFFF)).dechex(rand(0x10000000,0x7FFFFFFF));
mysql_query("INSERT INTO {$database['prefix']}Sessions(id, address, created, updated) VALUES('$id', '{$_SERVER['REMOTE_ADDR']}', UNIX_TIMESTAMP(), UNIX_TIMESTAMP())");
if(mysql_affected_rows()>0)
return $id;
}
return false;
}
function setSessionAnonymous($currentId){
$id=getAnonymousSession();
if($id!==false){
if($id!=$currentId)
session_id($id);
return true;
}
$id=newAnonymousSession();
if($id!==false){
session_id($id);
return true;
}
return false;
}
function isSessionAuthorized($id){
global $database;
$result=mysql_query("select id from {$database['prefix']}Sessions where id = '$id' and address = '{$_SERVER['REMOTE_ADDR']}' and (userid is not null or preexistence is not null)");
if($result&&(mysql_num_rows($result)==1))
return true;
return false;
}
function setSession(){
$id=empty($_COOKIE[session_name()])?'':$_COOKIE[session_name()];
if((strlen($id)<32)||!isSessionAuthorized($id))
setSessionAnonymous($id);
}
session_name('TSSESSION');
setSession();
session_set_save_handler('openSession','closeSession','readSession','writeSession','destroySession','gcSession');
session_cache_expire(1);
session_set_cookie_params(0,'/',$service['domain']);
if(session_start()!==true){
header('HTTP/1.1 503 Service Unavailable');
}
function doesHaveMembership(){
return empty($_SESSION['userid'])?false:true;
}
function getUserId(){
return empty($_SESSION['userid'])?false:$_SESSION['userid'];
}
function doesHaveOwnership(){
global $owner;
if(empty($_SESSION['userid'])||($_SESSION['userid']!=$owner))
return false;
return true;
}
if(doesHaveMembership()){
$user=array('id'=>getUserId());
list($user['loginid'],$user['name'])=fetchQueryRow("select loginid, name from {$database['prefix']}Users where userid = {$user['id']}");
list($user['blog'],$user['timezone'])=fetchQueryRow("select name, timezone from {$database['prefix']}BlogSettings where owner = {$user['id']}");
$user['homepage']=getBlogURL($user['blog']);
}else
$user=null;
Timezone::set(isset($blog['timezone'])?$blog['timezone']:$service['timezone']);
mysql_query('SET time_zone = \''.Timezone::getCanonical().'\'');
Locale::setDirectory('../../language');
Locale::set(isset($blog['language'])?$blog['language']:$service['language']);
$activePlugins=array();
$eventMappings=array();
$tagMappings=array();
if(!empty($owner)){
$activePlugins=fetchQueryColumn("SELECT name FROM {$database['prefix']}Plugins WHERE owner = $owner");
$xmls=new XMLStruct();
foreach($activePlugins as $plugin){
$manifest=@file_get_contents("../../plugins/$plugin/index.xml");
if($manifest&&$xmls->open($manifest)){
if($xmls->doesExist('/plugin/binding/listener')){
foreach($xmls->selectNodes('/plugin/binding/listener') as $listener){
if(!empty($listener['.attributes']['event'])&&!empty($listener['.value'])){
if(!isset($eventMappings[$listener['.attributes']['event']]))
$eventMappings[$listener['.attributes']['event']]=array();
array_push($eventMappings[$listener['.attributes']['event']],array('plugin'=>$plugin,'listener'=>$listener['.value']));
}
}
unset($listener);
}
if($xmls->doesExist('/plugin/binding/tag')){
foreach($xmls->selectNodes('/plugin/binding/tag') as $tag){
if(!empty($tag['.attributes']['name'])&&!empty($tag['.attributes']['handler'])){
if(!isset($tagMappings[$tag['.attributes']['name']]))
$tagMappings[$tag['.attributes']['name']]=array();
array_push($tagMappings[$tag['.attributes']['name']],array('plugin'=>$plugin,'handler'=>$tag['.attributes']['handler']));
}
}
unset($tag);
}
}else{
$plugin=mysql_escape_string($plugin);
mysql_query("DELETE FROM {$database['prefix']}Plugins WHERE owner = $owner AND name = '$plugin'");
}
}
unset($xmls);
unset($plugin);
}
function fireEvent($event,$target=null,$mother=null,$condition=true){
global $service,$eventMappings,$pluginURL;
if(!$condition)
return $target;
if(!isset($eventMappings[$event]))
return $target;
foreach($eventMappings[$event] as $mapping){
include_once ("../../plugins/{$mapping['plugin']}/index.php");
if(function_exists($mapping['listener'])){
$pluginURL="{$service['path']}/plugins/{$mapping['plugin']}";
$target=call_user_func($mapping['listener'],$target,$mother);
}
}
return $target;
}
function handleTags(&$content){
global $service,$tagMappings,$pluginURL;
if(preg_match_all('/\[##_(\w+)_##\]/',$content,$matches)){
foreach($matches[1] as $tag){
if(!isset($tagMappings[$tag]))
continue;
$target='';
foreach($tagMappings[$tag] as $mapping){
include_once ("../../plugins/{$mapping['plugin']}/index.php");
if(function_exists($mapping['handler'])){
$pluginURL="{$service['path']}/plugins/{$mapping['plugin']}";
$target=call_user_func($mapping['handler'],$target);
}
}
dress($tag,$target,$content);
}
}
}
function respondErrorPage($message=''){
global $service;?>
=TATTERTOOLS_NAME?>
exit;
}
function getPagingView(&$paging,&$template,&$itemTemplate){
if(($paging===false)||empty($paging['page']))
return '';
$url=encodeURL($paging['url']);
$prefix=$paging['prefix'];
$postfix=isset($paging['postfix'])?$paging['postfix']:'';
ob_start();
if(isset($paging['first'])){
$itemView="$itemTemplate ..";
dress('paging_rep_link_num','1',$itemView);
dress('paging_rep_link',"href='$url$prefix{$paging['first']}$postfix'",$itemView);
print ($itemView);
}elseif($paging['page']>5){
$itemView="$itemTemplate ..";
dress('paging_rep_link_num','1',$itemView);
dress('paging_rep_link',"href='$url{$prefix}1$postfix'",$itemView);
print ($itemView);
}
if(isset($paging['before']))
$page=$paging['page']-count($paging['before']);
else
$page=$paging['page']<5?1:$paging['page']-4;
if(isset($paging['before'])){
foreach($paging['before'] as $value){
$itemView=$itemTemplate;
dress('paging_rep_link_num',"$page",$itemView);
dress('paging_rep_link',"href='$url$prefix$value$postfix'",$itemView);
print ($itemView);
$page++;
}
}else{
for($i=0;($i<4)&&($page<$paging['page']);$i++){
$itemView=$itemTemplate;
dress('paging_rep_link_num',"$page",$itemView);
dress('paging_rep_link',"href='$url$prefix$page$postfix'",$itemView);
print ($itemView);
$page++;
}
}
if(($page==$paging['page'])&&($page<=$paging['pages'])){
$itemView=$itemTemplate;
dress('paging_rep_link_num',"$page",$itemView);
dress('paging_rep_link','style="color:red" class="selected"',$itemView);
print ($itemView);
$page++;
}
if(isset($paging['before'])){
foreach($paging['after'] as $value){
$itemView=$itemTemplate;
dress('paging_rep_link_num',"$page",$itemView);
dress('paging_rep_link',"href='$url$prefix$value$postfix'",$itemView);
print ($itemView);
$page++;
}
}else{
for($i=0;($i<4)&&($page<=$paging['pages']);$i++){
$itemView=$itemTemplate;
dress('paging_rep_link_num',"$page",$itemView);
dress('paging_rep_link',"href='$url$prefix$page$postfix'",$itemView);
print ($itemView);
$page++;
}
}
if(isset($paging['last'])){
$itemView=".. $itemTemplate";
dress('paging_rep_link_num',"{$paging['pages']}",$itemView);
dress('paging_rep_link',"href='$url$prefix{$paging['last']}$postfix'",$itemView);
print ($itemView);
}elseif(($paging['pages']-$paging['page'])>4){
$itemView=".. $itemTemplate";
dress('paging_rep_link_num',"{$paging['pages']}",$itemView);
dress('paging_rep_link',"href='$url$prefix{$paging['pages']}$postfix'",$itemView);
print ($itemView);
}
$itemsView=ob_get_contents();
ob_end_clean();
$view=$template;
dress('prev_page',isset($paging['prev'])?"href='$url$prefix{$paging['prev']}$postfix'":'',$view);
dress('paging_rep',$itemsView,$view);
dress('next_page',isset($paging['next'])?"href='$url$prefix{$paging['next']}$postfix'":'',$view);
return $view;
}
function dress($tag,$value,&$contents){
$contents=str_replace("[##_{$tag}_##]",$value,$contents);
}
function getUpperView($paging){
global $g_version,$service,$blogURL;
ob_start();?>
_
_
_
if(doesHaveOwnership()){?>
_
}?>