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 nl2brWithHTML($str){
$str=str_replace('[CODE]','[CODE][HTML]',$str);
$str=str_replace('[/CODE]','[/HTML][/CODE]',$str);
$inHTML=false;
$out='';
while(true){
if($inHTML){
$end=strpos($str,'[/HTML]');
if($end===false)
break;
else{
$out.=substr($str,0,$end);
$str=substr($str,$end+7);
$inHTML=false;
}
}else{
$offset=strpos($str,'[HTML]');
if($offset===false){
$out.=nl2br($str);
break;
}else{
$out.=nl2br(substr($str,0,$offset));
$str=substr($str,$offset+6);
$inHTML=true;
}
}
}
return $out;
}
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 getFileExtension($path){
for($i=strlen($path)-1;$i>=0;$i--){
if($path{$i}=='.')
return strtolower(substr($path,$i+1));
if(($path{$i}=='/')||($path{$i}=='\\'))
break;
}
return '';
}
function getAttributesFromString($str){
$attributes=array();
foreach(explode(' ',$str) as $value){
$value=trim($value);
if(preg_match('/([^= ]+)="([^"]*)/',$value,$matches)){
$attributes[$matches[1]]=$matches[2];
}elseif(preg_match("/([^= ]+)='([^']*)/",$value,$matches)){
$attributes[$matches[1]]=$matches[2];
}elseif(preg_match('/([^= ]+)=([^ ]*)/',$value,$matches)){
$attributes[$matches[1]]=$matches[2];
}
}
return $attributes;
}
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 getAttachmentByOnlyName($owner,$name){
global $database;
$name=mysql_escape_string($name);
return fetchQueryRow("select * from {$database['prefix']}Attachments where owner = $owner and name = '$name'");
}
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 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 getEntriesWithPagingByNotice($owner,$page,$count){
global $database,$folderURL,$suri;
$visibility=doesHaveOwnership()?'':'AND visibility = 2';
$sql="SELECT *, '"._t('공지')."' categoryLabel FROM {$database['prefix']}Entries WHERE owner = $owner $visibility AND category = -2 ORDER BY published DESC";
return fetchWithPaging($sql,$page,$count,"$folderURL/{$suri['value']}");
}
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 getEntryVisibilityName($visibility){
switch(abs($visibility)){
case 0:
return _t('비공개');
case 1:
return _t('보호');
case 2:
return _t('공개');
case 3:
default:
return _t('발행');
}
}
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 getKeywordNames($owner){
return array();
}
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 getTrackbacks($entry){
global $database,$owner;
$trackbacks=array();
$result=mysql_query("select * from {$database['prefix']}Trackbacks where owner = $owner AND entry = $entry order by written");
while($trackback=mysql_fetch_array($result))
array_push($trackbacks,$trackback);
return $trackbacks;
}
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 getTags($entry){
global $database,$owner;
$tags=array();
$result=mysql_query("select * from {$database['prefix']}Tags, {$database['prefix']}TagRelations where id = tag and entry = $entry and owner = $owner group by name order by name");
if($result){
while($tag=mysql_fetch_array($result))
array_push($tags,$tag);
}
return $tags;
}
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()){?>
_
}?>
$view=ob_get_contents();
ob_end_clean();
return $view;
}
function getLowerView(){
ob_start();
$view=ob_get_contents();
ob_end_clean();
return $view;
}
function getScriptsOnFoot(){
ob_start();?>
$view=ob_get_contents();
ob_end_clean();
return $view;
}
function getTrackbacksView($entryId,&$skin){
global $suri,$hostURL,$blogURL,$skinSetting;
$trackbacksView='';
foreach(getTrackbacks($entryId) as $trackback){
$trackbackView="".$skin->trackback;
dress('tb_rep_title',htmlspecialchars($trackback['subject']),$trackbackView);
dress('tb_rep_site',htmlspecialchars($trackback['site']),$trackbackView);
dress('tb_rep_url',htmlspecialchars($trackback['url']),$trackbackView);
dress('tb_rep_desc',htmlspecialchars($trackback['excerpt']),$trackbackView);
dress('tb_rep_onclick_delete',"deleteTrackback({$trackback['id']}, $entryId)",$trackbackView);
dress('tb_rep_date',Timestamp::format5($trackback['written']),$trackbackView);
$trackbacksView.=$trackbackView;
}
if($skinSetting['expandTrackback']==1||(($suri['directive']=='/'||$suri['directive']=='/entry')&&$suri['value']!='')){
$style='block';
}else{
$style='none';
}
$trackbacksView="".str_replace('[##_tb_rep_##]',$trackbacksView,$skin->trackbacks).'
';
dress('tb_address',"$hostURL$blogURL/trackback/$entryId",$trackbacksView);
return $trackbacksView;
}
function getCommentView($entryId,&$skin){
global $blogURL,$owner,$suri,$paging,$blog;
$authorized=doesHaveOwnership();
$skinValue=getSkinSetting($owner);
$blogSetting=getBlogSetting($owner);
if($entryId>0){
$prefix1='rp';
$prefix2='comment';
$isComment=true;
$SubItem='commentSubItem';
}else{
$prefix1='guest';
$prefix2='guest';
$isComment=false;
$SubItem='guestSubItem';
}
$commentView="';
$commentItemsView='';
if($entryId==0){
list($comments,$paging)=getCommentsWithPagingForGuestbook($owner,$suri['page'],$skinValue['commentsOnGuestbook']);
foreach($comments as $key=>$value){
if($value['secret']==1&&!$authorized){
$comments[$key]['name']='';
$comments[$key]['homepage']='';
$comments[$key]['comment']=_t('관리자만 볼 수 있는 댓글입니다');
}
}
}else{
$comments=getComments($entryId);
}
foreach($comments as $commentItem){
$commentItemView="".($isComment?$skin->commentItem:$skin->guestItem);
$commentSubItemsView='';
foreach(getCommentComments($commentItem['id']) as $commentSubItem){
$commentSubItemView="".($isComment?$skin->commentSubItem:$skin->guestSubItem);
if(empty($commentSubItem['homepage']))
dress($prefix1.'_rep_name',fireEvent(($isComment?'ViewCommenter':'ViewGuestCommenter'),htmlspecialchars($commentSubItem['name']),$commentSubItem),$commentSubItemView);
else
dress($prefix1.'_rep_name',fireEvent(($isComment?'ViewCommenter':'ViewGuestCommenter'),''.htmlspecialchars($commentSubItem['name']).'',$commentSubItem),$commentSubItemView);
dress($prefix1.'_rep_desc',fireEvent(($isComment?'ViewCommentContent':'ViewGuestCommentContent'),nl2br(addLinkSense(htmlspecialchars($commentSubItem['comment']),' onclick="return openLinkInNewWindow(this)"')),$commentSubItem),$commentSubItemView);
dress($prefix1.'_rep_date',Timestamp::format5($commentSubItem['written']),$commentSubItemView);
dress($prefix1.'_rep_link',"$blogURL/{$entryId}#comment{$commentSubItem['id']}",$commentSubItemView);
dress($prefix1.'_rep_onclick_delete',"deleteComment({$commentSubItem['id']});return false",$commentSubItemView);
$commentSubItemsView.=$commentSubItemView;
}
dress(($isComment?'rp2_rep':'guest_reply_rep'),$commentSubItemsView,$commentItemView);
if(empty($commentItem['homepage']))
dress($prefix1.'_rep_name',fireEvent(($isComment?'ViewCommenter':'ViewGuestCommenter'),htmlspecialchars($commentItem['name']),$commentItem),$commentItemView);
else
dress($prefix1.'_rep_name',fireEvent(($isComment?'ViewCommenter':'ViewGuestCommenter'),''.htmlspecialchars($commentItem['name']).'',$commentItem),$commentItemView);
dress($prefix1.'_rep_desc',fireEvent(($isComment?'ViewCommentContent':'ViewGuestCommentContent'),nl2br(addLinkSense(htmlspecialchars($commentItem['comment']),' onclick="return openLinkInNewWindow(this)"')),$commentItem),$commentItemView);
dress($prefix1.'_rep_date',Timestamp::format5($commentItem['written']),$commentItemView);
if($prefix1=='guest'&&$authorized!=true&&$blogSetting['allowWriteDoubleCommentOnGuestbook']==0){
$doubleCommentPermissionScript='alert(\''._t('댓글을 사용할 수 없습니다').'\');return false;';
}else{
$doubleCommentPermissionScript='';
}
dress($prefix1.'_rep_onclick_reply',$doubleCommentPermissionScript."commentComment({$commentItem['id']});return false",$commentItemView);
dress($prefix1.'_rep_onclick_delete',"deleteComment({$commentItem['id']});return false",$commentItemView);
dress($prefix1.'_rep_link',"$blogURL/{$entryId}#comment{$commentItem['id']}",$commentItemView);
$commentItemsView.=$commentItemView;
}
dress($prefix1.'_rep',$commentItemsView,$commentView);
if(!doesHaveOwnership()){
$commentMemberView=($isComment?$skin->commentMember:$skin->guestMember);
if(!doesHaveMembership()){
$commentGuestView=($isComment?$skin->commentGuest:$skin->guestGuest);
dress($prefix1.'_input_name','name',$commentGuestView);
dress($prefix1.'_input_password','password',$commentGuestView);
dress($prefix1.'_input_homepage','homepage',$commentGuestView);
if(!empty($_POST["name_$entryId"]))
$guestName=htmlspecialchars($_POST["name_$entryId"]);
elseif(!empty($_COOKIE['guestName']))
$guestName=htmlspecialchars($_COOKIE['guestName']);
else
$guestName='';
dress('guest_name',$guestName,$commentGuestView);
if(!empty($_POST["homepage_$entryId"])&&$_POST["homepage_$entryId"]!='http://'){
if(strpos($_POST["homepage_$entryId"],'http://')===0)
$guestHomepage=htmlspecialchars($_POST["homepage_$entryId"]);
else
$guestHomepage='http://'.htmlspecialchars($_POST["homepage_$entryId"]);
}elseif(!empty($_COOKIE['guestHomepage']))
$guestHomepage=htmlspecialchars($_COOKIE['guestHomepage']);
else
$guestHomepage='http://';
dress('guest_homepage',$guestHomepage,$commentGuestView);
dress($prefix1.($isComment?'_guest':'_form'),$commentGuestView,$commentMemberView);
}
dress($prefix1.'_input_is_secret','secret',$commentMemberView);
dress($prefix1.'_member',$commentMemberView,$commentView);
}
dress($prefix1.'_input_comment','comment',$commentView);
dress($prefix1.'_onclick_submit',"addComment(this, $entryId);return false",$commentView);
dress($prefix1.'_textarea_body','comment',$commentView);
dress($prefix1.'_textarea_body_value','',$commentView);
return $commentView;
}
function getCategoriesView($categories,$selected,$skin,$xhtml=false){
global $blogURL,$owner;
if(doesHaveOwnership()){
$entriesSign='entriesInLogin';
}else{
$entriesSign='entries';
}
$tree=array('id'=>0,'label'=>_t('전체'),'value'=>getEntriesTotalCount($owner),'link'=>"$blogURL/category",'children'=>array());
foreach($categories as $category1){
$children=array();
foreach($category1['children'] as $category2){
array_push($children,array('id'=>$category2['id'],'label'=>$category2['name'],'value'=>$category2[$entriesSign],'link'=>"$blogURL/category/".encodeURL($category1['name'].'/'.$category2['name']),'children'=>array()));
}
array_push($tree['children'],array('id'=>$category1['id'],'label'=>$category1['name'],'value'=>$category1[$entriesSign],'link'=>"$blogURL/category/".encodeURL($category1['name']),'children'=>$children));
}
ob_start();
printTreeView($tree,$selected,$skin,$xhtml);
$view=ob_get_contents();
ob_end_clean();
return $view;
}
function printTreeView($tree,$selected,$skin,$xhtml=false){
if($xhtml){
echo '';
return ;
}
$action=0;?>
if($skin['itemBgColor']==""){
$itemBgColor='';
}else{
$itemBgColor='background-color: #'.$skin['itemBgColor'].';';
}?>