/** * @brief RSS 전체피드 설정 **/ function procRssAdminInsertConfig() { $oModuleModel =& getModel('module'); $total_config = $oModuleModel->getModuleConfig('rss'); $config_vars = Context::getRequestVars(); $config_vars->feed_document_count = (int) $config_vars->feed_document_count; if (!$config_vars->use_total_feed) { $alt_message = 'msg_invalid_request'; } if (!in_array($config_vars->use_total_feed, array('Y', 'N'))) { $config_vars->open_rss = 'Y'; } if ($config_vars->image || $config_vars->del_image) { $image_obj = $config_vars->image; $config_vars->image = $total_config->image; // 삭제 요청에 대한 변수를 구함 if ($config_vars->del_image == 'Y' || $image_obj) { FileHandler::removeFile($config_vars->image); $config_vars->image = ''; $total_config->image = ''; } // 정상적으로 업로드된 파일이 아니면 무시 if ($image_obj['tmp_name'] && is_uploaded_file($image_obj['tmp_name'])) { // 이미지 파일이 아니어도 무시 (swf는 패스~) $image_obj['name'] = Context::convertEncodingStr($image_obj['name']); if (!preg_match("/\\.(jpg|jpeg|gif|png)\$/i", $image_obj['name'])) { $alt_message = 'msg_rss_invalid_image_format'; } else { // 경로를 정해서 업로드 $path = './files/attach/images/rss/'; // 디렉토리 생성 if (!FileHandler::makeDir($path)) { $alt_message = 'msg_error_occured'; } else { $filename = $path . $image_obj['name']; // 파일 이동 if (!move_uploaded_file($image_obj['tmp_name'], $filename)) { $alt_message = 'msg_error_occured'; } else { $config_vars->image = $filename; } } } } } if (!$config_vars->image && $config_vars->del_image != 'Y') { $config_vars->image = $total_config->image; } $output = $this->setFeedConfig($config_vars); if (!$alt_message) { $alt_message = 'success_updated'; } $alt_message = Context::getLang($alt_message); Context::set('msg', $alt_message); $this->setLayoutPath('./common/tpl'); $this->setLayoutFile('default_layout.html'); $this->setTemplatePath($this->module_path . 'tpl'); $this->setTemplateFile("top_refresh.html"); }
/** * prepares variables to use in moduleHandler * @param string $module name of module * @param string $act name of action * @param int $mid * @param int $document_srl * @param int $module_srl * @return void **/ function ModuleHandler($module = '', $act = '', $mid = '', $document_srl = '', $module_srl = '') { // If XE has not installed yet, set module as install if (!Context::isInstalled()) { $this->module = 'install'; $this->act = Context::get('act'); return; } // Set variables from request arguments $this->module = $module ? $module : Context::get('module'); $this->act = $act ? $act : Context::get('act'); $this->mid = $mid ? $mid : Context::get('mid'); $this->document_srl = $document_srl ? (int) $document_srl : (int) Context::get('document_srl'); $this->module_srl = $module_srl ? (int) $module_srl : (int) Context::get('module_srl'); $this->entry = Context::convertEncodingStr(Context::get('entry')); // Validate variables to prevent XSS $isInvalid = null; if ($this->module && !preg_match("/^([a-z0-9\\_\\-]+)\$/i", $this->module)) { $isInvalid = true; } if ($this->mid && !preg_match("/^([a-z0-9\\_\\-]+)\$/i", $this->mid)) { $isInvalid = true; } if ($this->act && !preg_match("/^([a-z0-9\\_\\-]+)\$/i", $this->act)) { $isInvalid = true; } if ($isInvalid) { htmlHeader(); echo Context::getLang("msg_invalid_request"); htmlFooter(); Context::close(); exit; } if (isset($this->act) && substr($this->act, 0, 4) == 'disp') { if (Context::get('_use_ssl') == 'optional' && Context::isExistsSSLAction($this->act) && $_SERVER['HTTPS'] != 'on') { header('location:https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']); return; } } // execute addon (before module initialization) $called_position = 'before_module_init'; $oAddonController =& getController('addon'); $addon_file = $oAddonController->getCacheFilePath(Mobile::isFromMobilePhone() ? 'mobile' : 'pc'); @(include $addon_file); }
/** * @brief rss 주소로 부터 내용을 받아오는 함수 * * tistory 의 경우 원본 주소가 location 헤더를 뿜는다.(내용은 없음) 이를 해결하기 위한 수정 **/ function rss_request($rss_url) { // request rss $rss_url = Context::convertEncodingStr($rss_url); $URL_parsed = parse_url($rss_url); if (strpos($URL_parsed["host"], 'naver.com')) { $rss_url = iconv('UTF-8', 'euc-kr', $rss_url); } $rss_url = str_replace(array('%2F', '%3F', '%3A', '%3D', '%3B', '%26'), array('/', '?', ':', '=', ';', '&'), urlencode($rss_url)); $URL_parsed = parse_url($rss_url); $host = $URL_parsed["host"]; $port = $URL_parsed["port"]; if ($port == 0) { $port = 80; } $path = $URL_parsed["path"]; if ($URL_parsed["query"] != '') { $path .= "?" . $URL_parsed["query"]; } $oReqeust = new HTTP_Request($rss_url); $oReqeust->addHeader('Content-Type', 'application/xml'); $oReqeust->addHeader('User-agent', 'RSS Reader Widget (XE ' . __ZBXE_VERSION__ . ' (http://www.xpressengine.com); PEAR HTTP_Request class (http://pear.php.net))'); $oReqeust->setMethod('GET'); $user = $URL_parsed["user"]; $pass = $URL_parsed["pass"]; if ($user) { $oReqeust->setBasicAuth($user, $pass); } $oResponse = $oReqeust->sendRequest(); if (PEAR::isError($oResponse)) { return; } $header = $oReqeust->getResponseHeader(); if ($header['location']) { return $this->rss_request(trim($header['location'])); } else { return $oReqeust->getResponseBody(); } }
function _getRssItems($args) { // 날짜 형태 $DATE_FORMAT = $args->date_format ? $args->date_format : "Y-m-d H:i:s"; $buff = $this->requestFeedContents($args->rss_url); $encoding = preg_match("/<\\?xml.*encoding=\"(.+)\".*\\?>/i", $buff, $matches); if ($encoding && !preg_match("/UTF-8/i", $matches[1])) { $buff = Context::convertEncodingStr($buff); } $buff = preg_replace("/<\\?xml.*\\?>/i", "", $buff); $oXmlParser = new XmlParser(); $xml_doc = $oXmlParser->parse($buff); if ($xml_doc->rss) { $rss->title = $xml_doc->rss->channel->title->body; $rss->link = $xml_doc->rss->channel->link->body; $items = $xml_doc->rss->channel->item; if (!$items) { return; } if ($items && !is_array($items)) { $items = array($items); } $content_items = array(); foreach ($items as $key => $value) { if ($key >= $args->list_count * $args->page_count) { break; } unset($item); foreach ($value as $key2 => $value2) { if (is_array($value2)) { $value2 = array_shift($value2); } $item->{$key2} = $this->_getRssBody($value2); } $content_item = new contentItem($rss->title); $content_item->setContentsLink($rss->link); $content_item->setTitle($item->title); $content_item->setNickName(max($item->author, $item->{'dc:creator'})); //$content_item->setCategory($item->category); $item->description = preg_replace('!<a href=!is', '<a onclick="window.open(this.href);return false" href=', $item->description); $content_item->setContent($item->description); $content_item->setLink($item->link); $date = date('YmdHis', strtotime(max($item->pubdate, $item->pubDate, $item->{'dc:date'}))); $content_item->setRegdate($date); $content_items[] = $content_item; } } elseif ($xml_doc->{'rdf:rdf'}) { // rss1.0 지원 (Xml이 대소문자를 구분해야 하는데 XE의 XML파서가 전부 소문자로 바꾸는 바람에 생긴 case) by misol $rss->title = $xml_doc->{'rdf:rdf'}->channel->title->body; $rss->link = $xml_doc->{'rdf:rdf'}->channel->link->body; $items = $xml_doc->{'rdf:rdf'}->item; if (!$items) { return; } if ($items && !is_array($items)) { $items = array($items); } $content_items = array(); foreach ($items as $key => $value) { if ($key >= $args->list_count * $args->page_count) { break; } unset($item); foreach ($value as $key2 => $value2) { if (is_array($value2)) { $value2 = array_shift($value2); } $item->{$key2} = $this->_getRssBody($value2); } $content_item = new contentItem($rss->title); $content_item->setContentsLink($rss->link); $content_item->setTitle($item->title); $content_item->setNickName(max($item->author, $item->{'dc:creator'})); //$content_item->setCategory($item->category); $item->description = preg_replace('!<a href=!is', '<a onclick="window.open(this.href);return false" href=', $item->description); $content_item->setContent($item->description); $content_item->setLink($item->link); $date = date('YmdHis', strtotime(max($item->pubdate, $item->pubDate, $item->{'dc:date'}))); $content_item->setRegdate($date); $content_items[] = $content_item; } } elseif ($xml_doc->feed && $xml_doc->feed->attrs->xmlns == 'http://www.w3.org/2005/Atom') { // Atom 1.0 spec 지원 by misol $rss->title = $xml_doc->feed->title->body; $links = $xml_doc->feed->link; if (is_array($links)) { foreach ($links as $value) { if ($value->attrs->rel == 'alternate') { $rss->link = $value->attrs->href; break; } } } elseif ($links->attrs->rel == 'alternate') { $rss->link = $links->attrs->href; } $items = $xml_doc->feed->entry; if (!$items) { return; } if ($items && !is_array($items)) { $items = array($items); } $content_items = array(); foreach ($items as $key => $value) { if ($key >= $args->list_count * $args->page_count) { break; } unset($item); foreach ($value as $key2 => $value2) { if (is_array($value2)) { $value2 = array_shift($value2); } $item->{$key2} = $this->_getRssBody($value2); } $content_item = new contentItem($rss->title); $links = $value->link; if (is_array($links)) { foreach ($links as $val) { if ($val->attrs->rel == 'alternate') { $item->link = $val->attrs->href; break; } } } elseif ($links->attrs->rel == 'alternate') { $item->link = $links->attrs->href; } $content_item->setContentsLink($rss->link); if ($item->title) { if (!preg_match("/html/i", $value->title->attrs->type)) { $item->title = $value->title->body; } } $content_item->setTitle($item->title); $content_item->setNickName(max($item->author, $item->{'dc:creator'})); $content_item->setAuthorSite($value->author->uri->body); //$content_item->setCategory($item->category); $item->description = preg_replace('!<a href=!is', '<a onclick="window.open(this.href);return false" href=', $item->content); if ($item->description) { if (!preg_match("/html/i", $value->content->attrs->type)) { $item->description = htmlspecialchars($item->description); } } if (!$item->description) { $item->description = $item->summary; if ($item->description) { if (!preg_match("/html/i", $value->summary->attrs->type)) { $item->description = htmlspecialchars($item->description); } } } $content_item->setContent($item->description); $content_item->setLink($item->link); $date = date('YmdHis', strtotime(max($item->published, $item->updated, $item->{'dc:date'}))); $content_item->setRegdate($date); $content_items[] = $content_item; } } return $content_items; }
/** * Returns object of error info * @return object object of error */ function getError() { $this->errstr = Context::convertEncodingStr($this->errstr); return new Object($this->errno, $this->errstr); }
/** * @brief css나 js파일을 묶어서 하나의 파일로 만들고 gzip 압축이나 헤더등을 통제하기 위해서 php파일을 별도로 만들어서 진행함 **/ function makeOptimizedFile($path, $filename, $targets, $type) { /** * 실제 css나 js의 내용을 합친 것을 구함 **/ // 대상 파일의 내용을 구해오고 css 파일일 경우 url()내의 경로를 변경 foreach ($targets as $file) { $str = FileHandler::readFile($file['file']); $str = Context::convertEncodingStr($str); // css 일경우 background:url() 변경 / media 적용 if ($type == 'css') { $str = $this->replaceCssPath($file['file'], $str); if ($file['media'] != 'all') { $str = '@media ' . $file['media'] . ' {' . "\n" . $str . "\n" . '}'; } } $content_buff .= $str . "\n"; } if ($type == 'css') { $content_buff = '@charset "UTF-8";' . "\n" . $content_buff; } $content_filename = substr($filename, 0, -4); FileHandler::writeFile($path . '/' . $content_filename, $content_buff); /** * 캐시 타임을 제대로 이용하기 위한 헤더 파일 구함 **/ // 확장자별 content-type 체크 if ($type == 'css') { $content_type = 'text/css'; } elseif ($type == 'js') { $content_type = 'text/javascript'; } // 캐시를 위한 처리 $unique = crc32($content_filename); $size = filesize($path . '/' . $content_file); $mtime = filemtime($path . '/' . $content_file); // js, css 파일을 php를 통해서 출력하고 이 출력시에 헤더값을 조작하여 캐싱과 압축전송이 되도록 함 (IE6는 CSS파일일 경우 gzip압축하지 않음) $header_buff = '<?php $content_filename = "' . $content_filename . '"; $mtime = ' . $mtime . '; $cached = false; $type = "' . $type . '"; if(isset($_SERVER["HTTP_IF_MODIFIED_SINCE"])) { $time = strtotime(preg_replace("/;.*$/", "", $_SERVER["HTTP_IF_MODIFIED_SINCE"])); if($mtime == $time) { header("HTTP/1.1 304"); $cached = true; } } if( preg_match("/MSIE 6.0/i",$_SERVER["HTTP_USER_AGENT"]) || strpos($_SERVER["HTTP_ACCEPT_ENCODING"], "gzip")===false || !function_exists("ob_gzhandler") ) { $size = filesize($content_filename); } else { $f = fopen($content_filename,"r"); $buff = fread($f, filesize($content_filename)); fclose($f); $buff = ob_gzhandler($buff, 5); $size = strlen($buff); header("Content-Encoding: gzip"); } header("Content-Type: ' . $content_type . '; charset=UTF-8"); header("Date: ' . substr(gmdate('r'), 0, -5) . 'GMT"); header("Expires: ' . substr(gmdate('r', strtotime('+1 MONTH')), 0, -5) . 'GMT"); header("Cache-Control: private, max-age=2592000"); header("Pragma: cache"); header("Last-Modified: ' . substr(gmdate('r', $mtime), 0, -5) . 'GMT"); header("ETag: \\"' . dechex($unique) . '-".dechex($size)."-' . dechex($mtime) . '\\""); if(!$cached) { if(empty($buff)) { $f = fopen($content_filename,"r"); fpassthru($f); } else print $buff; } ?>'; FileHandler::writeFile($path . '/' . $filename, $header_buff); }
/** * All RSS feeds configurations * * @return void */ function procRssAdminInsertConfig() { $oModuleModel = getModel('module'); $total_config = $oModuleModel->getModuleConfig('rss'); $config_vars = Context::getRequestVars(); $config_vars->feed_document_count = (int) $config_vars->feed_document_count; if (!$config_vars->use_total_feed) { $alt_message = 'msg_invalid_request'; } if (!in_array($config_vars->use_total_feed, array('Y', 'N'))) { $config_vars->open_rss = 'Y'; } if ($config_vars->image || $config_vars->del_image) { $image_obj = $config_vars->image; $config_vars->image = $total_config->image; // Get a variable for the delete request if ($config_vars->del_image == 'Y' || $image_obj) { FileHandler::removeFile($config_vars->image); $config_vars->image = ''; $total_config->image = ''; } // Ignore if the file is not the one which has been successfully uploaded if ($image_obj['tmp_name'] && is_uploaded_file($image_obj['tmp_name']) && checkUploadedFile($image_obj['tmp_name'])) { // Ignore if the file is not an image (swf is accepted ~) $image_obj['name'] = Context::convertEncodingStr($image_obj['name']); if (!preg_match("/\\.(jpg|jpeg|gif|png)\$/i", $image_obj['name'])) { $alt_message = 'msg_rss_invalid_image_format'; } else { // Upload the file to a path $path = './files/attach/images/rss/'; // Create a directory if (!FileHandler::makeDir($path)) { $alt_message = 'msg_error_occured'; } else { $filename = $path . $image_obj['name']; // Move the file if (!move_uploaded_file($image_obj['tmp_name'], $filename)) { $alt_message = 'msg_error_occured'; } else { $config_vars->image = $filename; } } } } } if (!$config_vars->image && $config_vars->del_image != 'Y') { $config_vars->image = $total_config->image; } $output = $this->setFeedConfig($config_vars); if (!$alt_message) { $alt_message = 'success_updated'; } $alt_message = Context::getLang($alt_message); $this->setMessage($alt_message, 'info'); //$this->setLayoutPath('./common/tpl'); //$this->setLayoutFile('default_layout.html'); //$this->setTemplatePath($this->module_path.'tpl'); //$this->setTemplateFile("top_refresh.html"); $returnUrl = Context::get('success_return_url') ? Context::get('success_return_url') : getNotEncodedUrl('', 'module', 'admin', 'act', 'dispRssAdminIndex'); $this->setRedirectUrl($returnUrl); }
/** * @brief request parameters and variables sort through the information widget */ function arrangeWidgetVars($widget, $request_vars, &$vars) { $oWidgetModel = getModel('widget'); $widget_info = $oWidgetModel->getWidgetInfo($widget); if (!$vars) { $vars = new stdClass(); } $widget = $vars->selected_widget; $vars->css_class = $request_vars->css_class; $vars->widgetstyle = $request_vars->widgetstyle; $vars->skin = trim($request_vars->skin); $vars->colorset = trim($request_vars->colorset); $vars->widget_sequence = (int) $request_vars->widget_sequence; $vars->widget_cache = (int) $request_vars->widget_cache; $vars->style = trim($request_vars->style); $vars->widget_padding_left = trim($request_vars->widget_padding_left); $vars->widget_padding_right = trim($request_vars->widget_padding_right); $vars->widget_padding_top = trim($request_vars->widget_padding_top); $vars->widget_padding_bottom = trim($request_vars->widget_padding_bottom); $vars->document_srl = trim($request_vars->document_srl); if (count($widget_info->extra_var)) { foreach ($widget_info->extra_var as $key => $val) { $vars->{$key} = trim($request_vars->{$key}); } } // If the widget style if ($request_vars->widgetstyle) { $widgetStyle_info = $oWidgetModel->getWidgetStyleInfo($request_vars->widgetstyle); if (count($widgetStyle_info->extra_var)) { foreach ($widgetStyle_info->extra_var as $key => $val) { if ($val->type == 'color' || $val->type == 'text' || $val->type == 'select' || $val->type == 'filebox' || $val->type == 'textarea') { $vars->{$key} = trim($request_vars->{$key}); } } } } if ($vars->widget_sequence) { $cache_file = sprintf('%s%d.%s.cache', $this->cache_path, $vars->widget_sequence, Context::getLangType()); FileHandler::removeFile($cache_file); } if ($vars->widget_cache > 0) { $vars->widget_sequence = getNextSequence(); } $attribute = array(); foreach ($vars as $key => $val) { if (!$val) { unset($vars->{$key}); continue; } if (strpos($val, '|@|') > 0) { $val = str_replace('|@|', ',', $val); } $vars->{$key} = Context::convertEncodingStr($val); $attribute[] = sprintf('%s="%s"', $key, htmlspecialchars(Context::convertEncodingStr($val), ENT_COMPAT | ENT_HTML401, 'UTF-8', false)); } return $attribute; }
function _getRssItems($args) { // Date Format $DATE_FORMAT = $args->date_format ? $args->date_format : "Y-m-d H:i:s"; $buff = $this->requestFeedContents($args->rss_url); $encoding = preg_match("/<\\?xml.*encoding=\"(.+)\".*\\?>/i", $buff, $matches); if ($encoding && stripos($matches[1], "UTF-8") === FALSE) { $buff = Context::convertEncodingStr($buff); } $buff = preg_replace("/<\\?xml.*\\?>/i", "", $buff); $oXmlParser = new XmlParser(); $xml_doc = $oXmlParser->parse($buff); if ($xml_doc->rss) { $rss->title = $xml_doc->rss->channel->title->body; $rss->link = $xml_doc->rss->channel->link->body; $items = $xml_doc->rss->channel->item; if (!$items) { return; } if ($items && !is_array($items)) { $items = array($items); } $content_items = array(); foreach ($items as $key => $value) { if ($key >= $args->list_count * $args->page_count) { break; } unset($item); foreach ($value as $key2 => $value2) { if (is_array($value2)) { $value2 = array_shift($value2); } $item->{$key2} = $this->_getRssBody($value2); } $content_item = new contentItem($rss->title); $content_item->setContentsLink($rss->link); $content_item->setTitle($item->title); $content_item->setNickName(max($item->author, $item->{'dc:creator'})); //$content_item->setCategory($item->category); $item->description = preg_replace('!<a href=!is', '<a onclick="window.open(this.href);return false" href=', $item->description); $content_item->setContent($this->_getSummary($item->description, $args->content_cut_size)); $content_item->setThumbnail($this->_getRssThumbnail($item->description)); $content_item->setLink($item->link); $date = date('YmdHis', strtotime(max($item->pubdate, $item->pubDate, $item->{'dc:date'}))); $content_item->setRegdate($date); $content_items[] = $content_item; } } else { if ($xml_doc->{'rdf:rdf'}) { // rss1.0 supported (XE's XML is case-insensitive because XML parser converts all to small letters. Fixed by misol $rss->title = $xml_doc->{'rdf:rdf'}->channel->title->body; $rss->link = $xml_doc->{'rdf:rdf'}->channel->link->body; $items = $xml_doc->{'rdf:rdf'}->item; if (!$items) { return; } if ($items && !is_array($items)) { $items = array($items); } $content_items = array(); foreach ($items as $key => $value) { if ($key >= $args->list_count * $args->page_count) { break; } unset($item); foreach ($value as $key2 => $value2) { if (is_array($value2)) { $value2 = array_shift($value2); } $item->{$key2} = $this->_getRssBody($value2); } $content_item = new contentItem($rss->title); $content_item->setContentsLink($rss->link); $content_item->setTitle($item->title); $content_item->setNickName(max($item->author, $item->{'dc:creator'})); //$content_item->setCategory($item->category); $item->description = preg_replace('!<a href=!is', '<a onclick="window.open(this.href);return false" href=', $item->description); $content_item->setContent($this->_getSummary($item->description, $args->content_cut_size)); $content_item->setThumbnail($this->_getRssThumbnail($item->description)); $content_item->setLink($item->link); $date = date('YmdHis', strtotime(max($item->pubdate, $item->pubDate, $item->{'dc:date'}))); $content_item->setRegdate($date); $content_items[] = $content_item; } } else { if ($xml_doc->feed && $xml_doc->feed->attrs->xmlns == 'http://www.w3.org/2005/Atom') { // Atom 1.0 spec supported by misol $rss->title = $xml_doc->feed->title->body; $links = $xml_doc->feed->link; if (is_array($links)) { foreach ($links as $value) { if ($value->attrs->rel == 'alternate') { $rss->link = $value->attrs->href; break; } } } else { if ($links->attrs->rel == 'alternate') { $rss->link = $links->attrs->href; } } $items = $xml_doc->feed->entry; if (!$items) { return; } if ($items && !is_array($items)) { $items = array($items); } $content_items = array(); foreach ($items as $key => $value) { if ($key >= $args->list_count * $args->page_count) { break; } unset($item); foreach ($value as $key2 => $value2) { if (is_array($value2)) { $value2 = array_shift($value2); } $item->{$key2} = $this->_getRssBody($value2); } $content_item = new contentItem($rss->title); $links = $value->link; if (is_array($links)) { foreach ($links as $val) { if ($val->attrs->rel == 'alternate') { $item->link = $val->attrs->href; break; } } } else { if ($links->attrs->rel == 'alternate') { $item->link = $links->attrs->href; } } $content_item->setContentsLink($rss->link); if ($item->title) { if (stripos($value->title->attrs->type, "html") === FALSE) { $item->title = $value->title->body; } } $content_item->setTitle($item->title); $content_item->setNickName(max($item->author, $item->{'dc:creator'})); $content_item->setAuthorSite($value->author->uri->body); //$content_item->setCategory($item->category); $item->description = $item->content ? $item->content : ($item->description = $item->summary); $item->description = preg_replace('!<a href=!is', '<a onclick="window.open(this.href);return false" href=', $item->description); if ($item->content && stripos($value->content->attrs->type, "html") === FALSE || !$item->content && stripos($value->summary->attrs->type, "html") === FALSE) { $item->description = htmlspecialchars($item->description, ENT_COMPAT | ENT_HTML401, 'UTF-8', false); } $content_item->setContent($this->_getSummary($item->description, $args->content_cut_size)); $content_item->setThumbnail($this->_getRssThumbnail($item->description)); $content_item->setLink($item->link); $date = date('YmdHis', strtotime(max($item->published, $item->updated, $item->{'dc:date'}))); $content_item->setRegdate($date); $content_items[] = $content_item; } } } } return $content_items; }
/** * prepares variables to use in moduleHandler * @param string $module name of module * @param string $act name of action * @param int $mid * @param int $document_srl * @param int $module_srl * @return void * */ function ModuleHandler($module = '', $act = '', $mid = '', $document_srl = '', $module_srl = '') { // If XE has not installed yet, set module as install if (!Context::isInstalled()) { $this->module = 'install'; $this->act = Context::get('act'); return; } $oContext = Context::getInstance(); if ($oContext->isSuccessInit == FALSE) { $logged_info = Context::get('logged_info'); if ($logged_info->is_admin != "Y") { $this->error = 'msg_invalid_request'; return; } } // Set variables from request arguments $this->module = $module ? $module : Context::get('module'); $this->act = $act ? $act : Context::get('act'); $this->mid = $mid ? $mid : Context::get('mid'); $this->document_srl = $document_srl ? (int) $document_srl : (int) Context::get('document_srl'); $this->module_srl = $module_srl ? (int) $module_srl : (int) Context::get('module_srl'); if ($entry = Context::get('entry')) { $this->entry = Context::convertEncodingStr($entry); } // Validate variables to prevent XSS $isInvalid = NULL; if ($this->module && !preg_match("/^([a-z0-9\\_\\-]+)\$/i", $this->module)) { $isInvalid = TRUE; } if ($this->mid && !preg_match("/^([a-z0-9\\_\\-]+)\$/i", $this->mid)) { $isInvalid = TRUE; } if ($this->act && !preg_match("/^([a-z0-9\\_\\-]+)\$/i", $this->act)) { $isInvalid = TRUE; } if ($isInvalid) { htmlHeader(); echo Context::getLang("msg_invalid_request"); htmlFooter(); Context::close(); exit; } if (isset($this->act) && (strlen($this->act) >= 4 && substr_compare($this->act, 'disp', 0, 4) === 0)) { if (Context::get('_use_ssl') == 'optional' && Context::isExistsSSLAction($this->act) && $_SERVER['HTTPS'] != 'on') { if (Context::get('_https_port') != null) { header('location:https://' . $_SERVER['HTTP_HOST'] . ':' . Context::get('_https_port') . $_SERVER['REQUEST_URI']); } else { header('location:https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']); } return; } } // call a trigger before moduleHandler init ModuleHandler::triggerCall('moduleHandler.init', 'before', $this); // execute addon (before module initialization) $called_position = 'before_module_init'; $oAddonController = getController('addon'); $addon_file = $oAddonController->getCacheFilePath(Mobile::isFromMobilePhone() ? 'mobile' : 'pc'); if (file_exists($addon_file)) { include $addon_file; } }
/** * Return request URL * @return string request URL */ function getRequestUrl() { static $url = null; if (is_null($url)) { $url = Context::getRequestUri(); if (count($_GET)) { foreach ($_GET as $key => $val) { $vars[] = $key . '=' . ($val ? urlencode(Context::convertEncodingStr($val)) : ''); } $url .= '?' . join('&', $vars); } } return $url; }
/** * @brief SMS를 받는다 * **/ function procPlanetInsertSMS() { $phone_number = Context::get('phone_number'); $message = Context::get('message'); $message = Context::convertEncodingStr($message); //@골뱅이를 빼자 if (substr($message, 0, 1) == '@') { $message = substr($message, 1); } $args->phone_number = $phone_number; $oPlanetModel =& getModel('planet'); $output = $oPlanetModel->getSMSUser($args); // SMS 사용자가 있으면 해당 planet에 등록 if ($output->data) { $args->content = $message; $args->module_srl = $output->data->module_srl; $args->member_srl = $output->data->member_srl; $oMemberModel =& getModel('member'); $output = $oMemberModel->getMemberInfoByMemberSrl($args->member_srl); $args->user_id = $output->user_id; $args->user_name = $output->user_name; $args->nick_name = $output->nick_name; $args->email_address = $output->email_address; $args->homepage = $output->homepage; $module_info = $oPlanetModel->getPlanetConfig(); $args->tags = join(',', $module_info->smstag); $manual_inserted = true; $output = $this->insertContent($args, $manual_inserted); } else { // SMS 사용자가 아니라면 planet_sms_resv에 쌓는다 $output = $this->insertSMSRecv($phone_number, $message); } if ($output->toBool()) { header("X-SMSMORESPONSE:0"); } else { header("X-SMSMORESPONSE:1"); } // response를 XMLRPC로 변환 Context::setResponseMethod('XMLRPC'); return $output; }
/** * @brief rss_url 의 정보를 구해서 return * title, homepage, rss_url **/ function procLivexeGet() { $rss_url = Context::get('rss_url'); if (!$rss_url) { return new Object(-1, 'msg_invalid_request'); } if (strpos($rss_url, '://') === false) { $rss_url = 'http://' . $rss_url; } $body = Context::convertEncodingStr(FileHandler::getRemoteResource($rss_url, null, 3, 'GET', 'application/xml', array('User-Agent' => 'liveXE ( ' . Context::getRequestUri() . ' )'))); $body = $this->_checkAndCorrectEncodingInPI($body); $oXml = new XmlParser(); $doc = $oXml->parse($body); if ($doc->rss->attrs->version == '2.0') { $this->add('title', $doc->rss->channel->title->body); $this->add('homepage', $doc->rss->channel->link->body); $this->add('rss_url', $rss_url); } elseif (preg_match('/atom/i', $doc->feed->attrs->xmlns)) { $this->add('title', $doc->feed->title->body); if (is_array($doc->feed->link)) { $this->add('homepage', $doc->feed->link[0]->attrs->href); } else { $this->add('homepage', $doc->feed->link->attrs->href); } $this->add('rss_url', $rss_url); } else { return new Object(-1, 'msg_not_supported_rss'); } }