class CRedirector { public static $url_id; public static function jump( $surl ) { FREE_TRIAL_VERSION($surl); } public static function getJumpUrl( $surl ) { $vurl = self::getVirtualUrl( $surl ); if ( !$vurl ) { $vurl = self::get404Url(); } self::log($surl,$vurl); return $vurl; } public static function getVirtualUrl( $surl, $id=-1 ) { if ( is_array($surl) ) { $rs = $surl; } else if (!( $rs = self::getRec( $surl, $id ) )) { return null; } self::$url_id = $rs["url_id"]; $vurl = self::applyModi( $rs ); return $vurl; } public static function getVirtualUrlById( $id ) { return self::getVirtualUrl( "", $id ); } public static function get404Url() { $rs = CCfgDb::get("cfgapp"); return $rs["url-404page"]; } public static function log( $surl, $vurl ) { } private static function setupRec( &$rs ) { if ( $rs["idata"] ) { $idata = CJson::decode($rs["idata"]); unset($idata["notes"]); $rs = array_merge($rs,$idata); } else { $rs["modi_id"] = 0; } } private static function getRec( $surl, $id=-1 ) { //-- open database CDb::open(); //-- build clauses $clx = array(); //-- select clause $sx = array( "url.url_id", "url.group_id", "url.durl", "url.modi_id", "modi.idata", "user.time_zone", ); $clx[] = CSql::clSelect($sx); //-- from clause $fromx = array(); $fromx[] = CSql::clFrom("url"); $fromx[] = CSql::clLeftJoin("modi","modi_id", "url","modi_id"); $fromx[] = CSql::clLeftJoin("user","group_id", "url","group_id"); $clx[] = implode("\n",$fromx); //-- where clause $cond = array(); if ( $id != -1 ) { $cond[] = CSql::clCond("url_id","=",$id); } else { $cond[] = CSql::clCond("surl","=",$surl); } if ( count($cond) > 0 ) { $clx[] = CSql::clWhere("AND",$cond); } //-- limit clause $clx[] = "LIMIT 1"; //-- run query $result = CSql::query($clx); if ( CDb::getRowCount( $result ) == 0 ) { CDb::freeResult($result); return null; } $rs = CDb::getRowA( $result ); self::setupRec( $rs ); return $rs; } public static function incCounter( $url_id ) { CDb::open(); CTable::updateByID( "url", "url_id", $url_id, array( "`cnt`=`cnt`+1" )); } private static function applyModi( $rs ) { $durl = $rs["durl"]; if ( !$rs["modi_id"] ) { return $durl; } if ( !self::inValidTimeRange( $rs ) ) { return $durl; } if ( $rs["b_get_params"] ) { $durl = self::appendParam($durl,$rs["get_params"]); } $vurl = ( $rs["b_rurl"] ) ? $rs["rurl"] : $durl; if ( $rs["b_rurl"] ) { if ( $rs["b_send_durl"] ) { if ( $rs["b_base64"] ) { $val = base64_encode($durl); } else { $val = $durl; } $param = $rs["durlkey"] . "=" . urlencode($val); $vurl = self::appendParam($vurl,$param); } } return $vurl; } private static function inValidTimeRange( $rs ) { if ( !$rs["b_period"] ) { return true; } CAppUTC::setup( $rs["time_zone"] ); $utc_now = CAppUTC::utcTStrNow(); if ( !empty($rs["dt_start"]) && ( $utc_now < CAppUTC::toUTC($rs["dt_start"]) ) ) { return false; } if ( !empty($rs["dt_end"]) && ( $utc_now > CAppUTC::toUTC($rs["dt_end"]) ) ) { return false; } return true; } private static function appendParam( $url, $param ) { if ( empty($param) ) { return $url; } //-- fragment $fragment = null; $ux = explode("#",$url); if ( count($ux) > 1 ) { $url = array_shift($ux); $fragment = implode("#",$ux); } //-- query string if ( strpos($url,"?") !== false ) { $ch = substr($url, -1); if (( $ch != "?" ) && ( $ch != "&" )) { $url .= "&"; } } else { $url .= "?"; } //-- normalize GET parameters $ch = substr($param,0,1); if (( $ch == "?" ) || ( $ch == "&" )) { $param = substr($param,1); } //-- add GET parameters $url .= $param; //-- restore fragment if ( !is_null($fragment) ) { $url .= ( "#" . $fragment ); } return $url; } }