Файловый менеджер - Редактировать - /home/wuectly/www/03cbe/archive.tar
Назад
view.html.php 0000604 00000045635 15245536007 0007212 0 ustar 00 <?php /** * @package AcyMailing for Joomla! * @version 5.9.6 * @author acyba.com * @copyright (C) 2009-2018 ACYBA S.A.R.L. All rights reserved. * @license GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html */ defined('_JEXEC') or die('Restricted access'); ?><?php class archiveViewArchive extends acymailingView{ function display($tpl = null){ $function = $this->getLayout(); if(method_exists($this, $function)) $this->$function(); parent::display($tpl); } function forward(){ $subkeys = acymailing_getVar('string', 'subid', acymailing_getVar('string', 'sub')); if(!empty($subkeys)){ $subid = intval(substr($subkeys, 0, strpos($subkeys, '-'))); $subkey = substr($subkeys, strpos($subkeys, '-') + 1); $receiver = acymailing_loadObject('SELECT * FROM '.acymailing_table('subscriber').' WHERE `subid` = '.intval($subid).' AND `key` = '.acymailing_escapeDB($subkey).' LIMIT 1'); } $currentEmail = acymailing_currentUserEmail(); if(empty($receiver) AND !empty($currentEmail)){ $userClass = acymailing_get('class.subscriber'); $receiver = $userClass->get($currentEmail); } if(empty($receiver)){ $receiver = new stdClass(); $receiver->name = ''; $receiver->email = ''; } $this->senderName = $receiver->name; $this->senderMail = $receiver->email; $config = acymailing_config(); $this->config = $config; $js = 'var numForwarders = 1;function addLine(){ if(numForwarders > 4) return; var myTable = window.document.getElementById("friend_table"); var line1 = document.createElement("tr"); var tdname = document.createElement("td"); var itdname = document.createElement("td"); var line2 = document.createElement("tr"); var tdemail = document.createElement("td"); var itdemail = document.createElement("td"); var inputName = document.createElement("input"); inputName.type = \'text\'; inputName.name = \'forwardusers[\'+numForwarders+\'][name]\'; inputName.style.width = "200px"; var inputEmail = document.createElement("input"); inputEmail.type = \'text\'; inputEmail.name = \'forwardusers[\'+numForwarders+\'][email]\'; inputEmail.style.width = "200px"; var nameLabel = document.createElement("label"); nameLabel.innerHTML="'.acymailing_translation('FRIEND_NAME', true).'"; var emailLabel = document.createElement("label"); emailLabel.innerHTML="'.acymailing_translation('FRIEND_EMAIL', true).'"; tdname.appendChild(nameLabel); itdname.appendChild(inputName); line1.appendChild(tdname); line1.appendChild(itdname); myTable.appendChild(line1); tdemail.appendChild(emailLabel); itdemail.appendChild(inputEmail); line2.appendChild(tdemail); line2.appendChild(itdemail); myTable.appendChild(line2); numForwarders++; } '; acymailing_addScript(true, $js); return $this->view(); } private function addFeed(){ $config = acymailing_config(); $feedType = $config->get('acyrss_format', ''); if(empty($feedType)) return; $document = JFactory::getDocument(); $link = '&format=feed&limitstart='; if($feedType == 'rss' || $feedType == 'both'){ $attribs = array('type' => 'application/rss+xml', 'title' => 'RSS 2.0'); $document->addHeadLink(acymailing_route($link.'&type=rss'), 'alternate', 'rel', $attribs); } if($feedType == 'atom' || $feedType == 'both'){ $attribs = array('type' => 'application/atom+xml', 'title' => 'Atom 1.0'); $document->addHeadLink(acymailing_route($link.'&type=atom'), 'alternate', 'rel', $attribs); } } function listing(){ global $Itemid; $values = new stdClass(); $menu = acymailing_getMenu(); $myItem = empty($Itemid) ? '' : '&Itemid='.$Itemid; $this->item = $myItem; if(is_object($menu)){ $menuparams = new acyParameter($menu->params); } $pageInfo = new stdClass(); $pageInfo->filter = new stdClass(); $pageInfo->filter->order = new stdClass(); $pageInfo->limit = new stdClass(); $pageInfo->elements = new stdClass(); $paramBase = ACYMAILING_COMPONENT.'.'.$this->getName(); $pageInfo->filter->order->dir = acymailing_getUserVar($paramBase.".ordering_dir", 'ordering_dir', 'DESC', 'word'); $pageInfo->filter->order->value = acymailing_getUserVar($paramBase.".ordering", 'ordering', 'senddate', 'cmd'); if(strtolower($pageInfo->filter->order->dir) !== 'desc') $pageInfo->filter->order->dir = 'asc'; $pageInfo->search = acymailing_getUserVar($paramBase.".search", 'search', '', 'string'); $pageInfo->search = strtolower(trim($pageInfo->search)); $pageInfo->limit->value = acymailing_getUserVar($paramBase.'.list_limit', 'limit', acymailing_getCMSConfig('list_limit'), 'int'); $pageInfo->limit->start = acymailing_getVar('int', 'limitstart', 0); $listClass = acymailing_get('class.list'); $listid = acymailing_getCID('listid'); if(empty($listid) && !empty($menuparams)){ $listid = $menuparams->get('listid'); } $currentUserid = acymailing_currentUserId(); if(empty($listid)){ $allLists = $listClass->getLists('listid'); }else{ $oneList = $listClass->get($listid); if(empty($oneList->listid)) return acymailing_raiseError(E_ERROR, 404, 'Mailing List not found : '.$listid); $allLists = array($oneList->listid => $oneList); if($oneList->access_sub != 'all' && ($oneList->access_sub == 'none' || empty($currentUserid) || !acymailing_isAllowed($oneList->access_sub))) $allLists = array(); } if(empty($allLists)){ if(empty($currentUserid)){ acymailing_askLog(); }else{ acymailing_enqueueMessage(acymailing_translation('ACY_NOTALLOWED'), 'error'); acymailing_redirect(acymailing_completeLink('lists', false, true)); } return false; } $config = acymailing_config(); if(!empty($menuparams)){ $values->suffix = $menuparams->get('pageclass_sfx', ''); $values->page_title = $menuparams->get('page_title'); $values->page_heading = ACYMAILING_J16 ? $menuparams->get('page_heading') : $menuparams->get('page_title'); $values->show_page_heading = ACYMAILING_J16 ? $menuparams->get('show_page_heading', 1) : $menuparams->get('show_page_title', 1); }else{ $values->suffix = ''; $values->show_page_heading = 1; } $values->show_description = $config->get('show_description', 1); $values->show_senddate = $config->get('show_senddate', 1); $values->show_receiveemail = $config->get('show_receiveemail', 0) && acymailing_level(1); $values->filter = $config->get('show_filter', 1); if(empty($values->page_title)) $values->page_title = (count($allLists) > 1 || empty($listid)) ? acymailing_translation('NEWSLETTERS') : $allLists[$listid]->name; if(empty($values->page_heading)) $values->page_heading = (count($allLists) > 1 || empty($listid)) ? acymailing_translation('NEWSLETTERS') : $allLists[$listid]->name; if(empty($menuparams)){ acymailing_addBreadcrumb(acymailing_translation('MAILING_LISTS'), acymailing_completeLink('lists')); acymailing_addBreadcrumb($values->page_title); }elseif(!$menuparams->get('listid')){ acymailing_addBreadcrumb($values->page_title); } acymailing_setPageTitle($values->page_title); $this->addFeed(); $searchMap = array('a.mailid', 'a.subject', 'a.alias', 'a.body'); $filters = array(); if(!empty($pageInfo->search)){ $searchVal = '\'%'.acymailing_getEscaped($pageInfo->search, true).'%\''; $filters[] = implode(" LIKE $searchVal OR ", $searchMap)." LIKE $searchVal"; } $filters[] = 'a.type = \'news\''; $noManageableLists = array(); $currentUserid = acymailing_currentUserId(); foreach($allLists as &$oneList){ if(empty($currentUserid)) $noManageableLists[] = $oneList->listid; if((int)acymailing_currentUserId() == (int)$oneList->userid) continue; if($oneList->access_manage == 'all' || acymailing_isAllowed($oneList->access_manage)) continue; $noManageableLists[] = $oneList->listid; } $accessFilter = ''; $manageableLists = array_diff(array_keys($allLists), $noManageableLists); if(!empty($manageableLists)) $accessFilter = 'c.listid IN ('.implode(',', $manageableLists).')'; if(!empty($noManageableLists)){ if(empty($accessFilter)){ $accessFilter = 'c.listid IN ('.implode(',', $noManageableLists).') AND a.published = 1 AND a.visible = 1'; }else $accessFilter .= ' OR (c.listid IN ('.implode(',', $noManageableLists).') AND a.published = 1 AND a.visible = 1)'; } if(!empty($accessFilter)) $filters[] = $accessFilter; $selection = array_merge($searchMap, array('a.senddate', 'a.created', 'a.visible', 'a.published', 'a.fromname', 'a.fromemail', 'a.replyname', 'a.replyemail', 'a.userid', 'a.summary', 'a.thumb', 'c.listid')); $query = 'SELECT "" AS body, "" AS altbody, html AS sendHTML, '.implode(',', $selection); $query .= ' FROM '.acymailing_table('listmail').' as c'; $query .= ' JOIN '.acymailing_table('mail').' as a on a.mailid = c.mailid '; $query .= ' WHERE ('.implode(') AND (', $filters).')'; $query .= ' GROUP BY c.mailid'; $query .= ' ORDER BY a.'.acymailing_secureField($pageInfo->filter->order->value).' '.acymailing_secureField($pageInfo->filter->order->dir).', c.mailid DESC'; $rows = acymailing_loadObjectList($query, '', $pageInfo->limit->start, $pageInfo->limit->value); $pageInfo->elements->page = count($rows); if($pageInfo->limit->value > $pageInfo->elements->page){ $pageInfo->elements->total = $pageInfo->limit->start + $pageInfo->elements->page; }else{ $queryCount = 'SELECT COUNT(DISTINCT c.mailid) FROM '.acymailing_table('listmail').' as c'; $queryCount .= ' JOIN '.acymailing_table('mail').' as a on a.mailid = c.mailid '; $queryCount .= ' WHERE ('.implode(') AND (', $filters).')'; $pageInfo->elements->total = acymailing_loadResult($queryCount); } $currentEmail = acymailing_currentUserEmail(); if(!empty($currentEmail)){ $userClass = acymailing_get('class.subscriber'); $receiver = $userClass->get($currentEmail); } if(empty($receiver)){ $receiver = new stdClass(); $receiver->name = acymailing_translation('VISITOR'); } acymailing_importPlugin('acymailing'); foreach($rows as $mail){ if(strpos($mail->subject, "{") !== false){ acymailing_trigger('acymailing_replacetags', array(&$mail, false)); acymailing_trigger('acymailing_replaceusertags', array(&$mail, &$receiver, false)); } } $pagination = new acyPagination($pageInfo->elements->total, $pageInfo->limit->start, $pageInfo->limit->value); $js = 'function changeReceiveEmail(checkedbox){ var form = document.adminForm; if(checkedbox){ form.nbreceiveemail.value++; }else{ form.nbreceiveemail.value--; } if(form.nbreceiveemail.value > 0 ){ document.getElementById(\'receiveemailbox\').className = \'receiveemailbox receiveemailbox_visible\'; }else{ document.getElementById(\'receiveemailbox\').className = \'receiveemailbox receiveemailbox_hidden\'; } } '; acymailing_addScript(true, $js); if(!empty($menuparams)) { $data = $menuparams->get("data", 1); if(!empty($data->{"menu-meta_description"})) acymailing_addMetadata('description', $data->{"menu-meta_description"}); if(!empty($data->{"menu-meta_keywords"})) acymailing_addMetadata('keywords', $data->{"menu-meta_keywords"}); } $orderValues = array(); $orderValues[] = acymailing_selectOption('senddate', acymailing_translation('SEND_DATE')); $orderValues[] = acymailing_selectOption('subject', acymailing_translation('JOOMEXT_SUBJECT')); $orderValues[] = acymailing_selectOption('created', acymailing_translation('CREATED_DATE')); $orderValues[] = acymailing_selectOption('mailid', acymailing_translation('ACY_ID')); $ordering = ''; if($config->get('show_order', 1) == 1){ $ordering = '<span style="float:right;" id="orderingoption">'; $ordering .= acymailing_select($orderValues, 'ordering', 'size="1" style="width:100px;" onchange="this.form.submit();"', 'value', 'text', $pageInfo->filter->order->value); $orderDir = array(); $orderDir[] = acymailing_selectOption('ASC', acymailing_translation('ACY_ASC')); $orderDir[] = acymailing_selectOption('DESC', acymailing_translation('ACY_DESC')); $ordering .= ' '.acymailing_select($orderDir, 'ordering_dir', 'size="1" style="width:75px;" onchange="this.form.submit();"', 'value', 'text', $pageInfo->filter->order->dir); $ordering .= '</span>'; } $this->ordering = $ordering; $this->rows = $rows; $this->values = $values; if(count($allLists) > 1){ $list = new stdClass(); $list->listid = 0; $list->description = ''; }else{ $list = array_pop($allLists); } $this->list = $list; $this->manageableLists = $manageableLists; $this->pagination = $pagination; $this->pageInfo = $pageInfo; $this->config = $config; } function view(){ $this->addFeed(); $frontEndManagement = false; $listid = acymailing_getCID('listid'); $values = new stdClass(); $values->suffix = ''; $menu = acymailing_getMenu(); if(is_object($menu)){ $menuparams = new acyParameter($menu->params); } if(!empty($menuparams)){ $values->suffix = $menuparams->get('pageclass_sfx', ''); } if(empty($listid) && !empty($menuparams)){ $listid = $menuparams->get('listid'); if($menuparams->get('menu-meta_description')) acymailing_addMetadata('description', $menuparams->get('menu-meta_description')); if($menuparams->get('menu-meta_keywords')) acymailing_addMetadata('keywords', $menuparams->get('menu-meta_keywords')); if($menuparams->get('robots')) acymailing_addMetadata('robots', $menuparams->get('robots')); if($menuparams->get('page_title')) acymailing_setPageTitle($menuparams->get('page_title')); } $config = acymailing_config(); $indexFollow = $config->get('indexFollow', ''); $tagIndFol = array(); if(strpos($indexFollow, 'noindex') !== false) $tagIndFol[] = 'noindex'; if(strpos($indexFollow, 'nofollow') !== false) $tagIndFol[] = 'nofollow'; if(!empty($tagIndFol)) acymailing_addMetadata('robots', implode(',', $tagIndFol)); if(!empty($listid)){ $listClass = acymailing_get('class.list'); $oneList = $listClass->get($listid); if(!empty($oneList->visible) && $oneList->published && (empty($menuparams) || !$menuparams->get('listid'))){ acymailing_addBreadcrumb($oneList->name, acymailing_completeLink('archive&listid='.$oneList->listid.':'.$oneList->alias)); } $currentUserid = acymailing_currentUserId(); if(!empty($oneList->listid) && acymailing_level(3)){ if(!empty($currentUserid) && $currentUserid == (int)$oneList->userid){ $frontEndManagement = true; } if(!empty($currentUserid)){ if($oneList->access_manage == 'all' || acymailing_isAllowed($oneList->access_manage)){ $frontEndManagement = true; } } } } $mailid = acymailing_getVar('string', 'mailid', 'nomailid'); if(empty($mailid)){ die('This is a Newsletter-template... and you can not access the online version of a Newsletter-template!<br />Please create a Newsletter using your template and then try again your "view it online" link!'); exit; } if($mailid == 'nomailid'){ $query = 'SELECT m.`mailid` FROM `#__acymailing_list` as l JOIN `#__acymailing_listmail` as lm ON l.listid=lm.listid JOIN `#__acymailing_mail` as m on lm.mailid = m.mailid'; $query .= ' WHERE l.`visible` = 1 AND l.`published` = 1 AND m.`visible`= 1 AND m.`published` = 1 AND m.`type` = "news" AND l.`type` = "list"'; if(!empty($listid)) $query .= ' AND l.`listid` = '.(int)$listid; $query .= ' ORDER BY m.`senddate` DESC, m.`mailid` DESC LIMIT 1'; $mailid = acymailing_loadResult($query); } $mailid = intval($mailid); if(empty($mailid)) return acymailing_raiseError(E_ERROR, 404, 'Newsletter not found'); $access_sub = true; $mailClass = acymailing_get('helper.mailer'); $mailClass->loadedToSend = false; $oneMail = $mailClass->load($mailid); if(empty($oneMail->mailid)){ return acymailing_raiseError(E_ERROR, 404, 'Newsletter not found : '.$mailid); } if(!$frontEndManagement AND (!$access_sub OR !$oneMail->published OR !$oneMail->visible)){ $key = acymailing_getVar('cmd', 'key'); if(empty($key) OR $key !== $oneMail->key){ $reason = (!$oneMail->published) ? 'Newsletter not published' : (!$oneMail->visible ? 'Newsletter not visible' : (!$access_sub ? 'Access not allowed' : '')); acymailing_enqueueMessage('You can not have access to this e-mail : '.$reason, 'error'); acymailing_redirect(acymailing_completeLink('lists', false, true)); return false; } } $fshare = ''; if(preg_match('#<img[^>]*id="pictshare"[^>]*>#i', $oneMail->body, $pregres) && preg_match('#src="([^"]*)"#i', $pregres[0], $pict)){ $fshare = $pict[1]; }elseif(preg_match('#<img[^>]*class="[^"]*pictshare[^"]*"[^>]*>#i', $oneMail->body, $pregres) && preg_match('#src="([^"]*)"#i', $pregres[0], $pict)){ $fshare = $pict[1]; }elseif(preg_match('#class="acymailing_content".*(<img[^>]*>)#is', $oneMail->body, $pregres) && preg_match('#src="([^"]*)"#i', $pregres[1], $pict)){ if(strpos($pregres[1], acymailing_translation('JOOMEXT_READ_MORE')) === false) $fshare = $pict[1]; } if(!empty($fshare)){ acymailing_addMetadata('og:image', $fshare); } acymailing_addMetadata('og:url', acymailing_frontendLink('archive&task=view&mailid='.$oneMail->mailid, false, acymailing_isNoTemplate(), true)); acymailing_addMetadata('og:title', $oneMail->subject); if(!empty($oneMail->metadesc)) acymailing_addMetadata('og:description', $oneMail->metadesc); $subkeys = acymailing_getVar('string', 'subid', acymailing_getVar('string', 'sub')); if(!empty($subkeys)){ $subid = intval(substr($subkeys, 0, strpos($subkeys, '-'))); $subkey = substr($subkeys, strpos($subkeys, '-') + 1); $receiver = acymailing_loadObject('SELECT * FROM '.acymailing_table('subscriber').' WHERE `subid` = '.acymailing_escapeDB($subid).' AND `key` = '.acymailing_escapeDB($subkey).' LIMIT 1'); } $currentEmail = acymailing_currentUserEmail(); if(empty($receiver) AND !empty($currentEmail)){ $userClass = acymailing_get('class.subscriber'); $receiver = $userClass->get($currentEmail); } if(empty($receiver)){ $receiver = new stdClass(); $receiver->name = acymailing_translation('VISITOR'); } $oneMail->sendHTML = true; acymailing_trigger('acymailing_replaceusertags', array(&$oneMail, &$receiver, false)); acymailing_addBreadcrumb($oneMail->subject); preg_match('@href="{unsubscribe:(.*)}"@', $oneMail->body, $match);//we get the tag unsubscribe if(!empty($match)){ $oneMail->body = str_replace($match[0], 'href="'.$match[1].'"', $oneMail->body); } acymailing_setPageTitle($oneMail->subject); if(!empty($oneMail->metadesc)){ acymailing_addMetadata('description', $oneMail->metadesc); } if(!empty($oneMail->metakey)){ acymailing_addMetadata('keywords', $oneMail->metakey); } $this->mail = $oneMail; $this->frontEndManagement = $frontEndManagement; $config = acymailing_config(); $this->config = $config; $this->receiver = $receiver; $this->values = $values; if($oneMail->html){ $templateClass = acymailing_get('class.template'); $templateClass->archiveSection = true; $templateClass->displayPreview('newsletter_preview_area', $oneMail->tempid, $oneMail->subject); } } } tmpl/default_items.php 0000604 00000022415 15245536007 0011065 0 ustar 00 <?php /** * @package Joomla.Site * @subpackage com_content * * @copyright (C) 2006 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; JHtml::addIncludePath(JPATH_COMPONENT . '/helpers'); $params = $this->params; ?> <div id="archive-items"> <?php foreach ($this->items as $i => $item) : ?> <?php $info = $item->params->get('info_block_position', 0); ?> <div class="row<?php echo $i % 2; ?>" itemscope itemtype="https://schema.org/Article"> <div class="page-header"> <h2 itemprop="headline"> <?php if ($params->get('link_titles')) : ?> <a href="<?php echo JRoute::_(ContentHelperRoute::getArticleRoute($item->slug, $item->catid, $item->language)); ?>" itemprop="url"> <?php echo $this->escape($item->title); ?> </a> <?php else : ?> <?php echo $this->escape($item->title); ?> <?php endif; ?> </h2> <?php // Content is generated by content plugin event "onContentAfterTitle" ?> <?php echo $item->event->afterDisplayTitle; ?> <?php if ($params->get('show_author') && !empty($item->author )) : ?> <div class="createdby" itemprop="author" itemscope itemtype="https://schema.org/Person"> <?php $author = $item->created_by_alias ?: $item->author; ?> <?php $author = '<span itemprop="name">' . $author . '</span>'; ?> <?php if (!empty($item->contact_link) && $params->get('link_author') == true) : ?> <?php echo JText::sprintf('COM_CONTENT_WRITTEN_BY', JHtml::_('link', $this->item->contact_link, $author, array('itemprop' => 'url'))); ?> <?php else : ?> <?php echo JText::sprintf('COM_CONTENT_WRITTEN_BY', $author); ?> <?php endif; ?> </div> <?php endif; ?> </div> <?php $useDefList = ($params->get('show_modify_date') || $params->get('show_publish_date') || $params->get('show_create_date') || $params->get('show_hits') || $params->get('show_category') || $params->get('show_parent_category')); ?> <?php if ($useDefList && ($info == 0 || $info == 2)) : ?> <div class="article-info muted"> <dl class="article-info"> <dt class="article-info-term"> <?php echo JText::_('COM_CONTENT_ARTICLE_INFO'); ?> </dt> <?php if ($params->get('show_parent_category') && !empty($item->parent_slug)) : ?> <dd> <div class="parent-category-name"> <?php $title = $this->escape($item->parent_title); ?> <?php if ($params->get('link_parent_category') && !empty($item->parent_slug)) : ?> <?php $url = '<a href="' . JRoute::_(ContentHelperRoute::getCategoryRoute($item->parent_slug)) . '" itemprop="genre">' . $title . '</a>'; ?> <?php echo JText::sprintf('COM_CONTENT_PARENT', $url); ?> <?php else : ?> <?php echo JText::sprintf('COM_CONTENT_PARENT', '<span itemprop="genre">' . $title . '</span>'); ?> <?php endif; ?> </div> </dd> <?php endif; ?> <?php if ($params->get('show_category')) : ?> <dd> <div class="category-name"> <?php $title = $this->escape($item->category_title); ?> <?php if ($params->get('link_category') && $item->catslug) : ?> <?php $url = '<a href="' . JRoute::_(ContentHelperRoute::getCategoryRoute($item->catslug)) . '" itemprop="genre">' . $title . '</a>'; ?> <?php echo JText::sprintf('COM_CONTENT_CATEGORY', $url); ?> <?php else : ?> <?php echo JText::sprintf('COM_CONTENT_CATEGORY', '<span itemprop="genre">' . $title . '</span>'); ?> <?php endif; ?> </div> </dd> <?php endif; ?> <?php if ($params->get('show_publish_date')) : ?> <dd> <div class="published"> <span class="icon-calendar" aria-hidden="true"></span> <time datetime="<?php echo JHtml::_('date', $item->publish_up, 'c'); ?>" itemprop="datePublished"> <?php echo JText::sprintf('COM_CONTENT_PUBLISHED_DATE_ON', JHtml::_('date', $item->publish_up, JText::_('DATE_FORMAT_LC3'))); ?> </time> </div> </dd> <?php endif; ?> <?php if ($info == 0) : ?> <?php if ($params->get('show_modify_date')) : ?> <dd> <div class="modified"> <span class="icon-calendar" aria-hidden="true"></span> <time datetime="<?php echo JHtml::_('date', $item->modified, 'c'); ?>" itemprop="dateModified"> <?php echo JText::sprintf('COM_CONTENT_LAST_UPDATED', JHtml::_('date', $item->modified, JText::_('DATE_FORMAT_LC3'))); ?> </time> </div> </dd> <?php endif; ?> <?php if ($params->get('show_create_date')) : ?> <dd> <div class="create"> <span class="icon-calendar" aria-hidden="true"></span> <time datetime="<?php echo JHtml::_('date', $item->created, 'c'); ?>" itemprop="dateCreated"> <?php echo JText::sprintf('COM_CONTENT_CREATED_DATE_ON', JHtml::_('date', $item->created, JText::_('DATE_FORMAT_LC3'))); ?> </time> </div> </dd> <?php endif; ?> <?php if ($params->get('show_hits')) : ?> <dd> <div class="hits"> <span class="icon-eye-open"></span> <meta itemprop="interactionCount" content="UserPageVisits:<?php echo $item->hits; ?>" /> <?php echo JText::sprintf('COM_CONTENT_ARTICLE_HITS', $item->hits); ?> </div> </dd> <?php endif; ?> <?php endif; ?> </dl> </div> <?php endif; ?> <?php // Content is generated by content plugin event "onContentBeforeDisplay" ?> <?php echo $item->event->beforeDisplayContent; ?> <?php if ($params->get('show_intro')) : ?> <div class="intro" itemprop="articleBody"> <?php echo JHtml::_('string.truncateComplex', $item->introtext, $params->get('introtext_limit')); ?> </div> <?php endif; ?> <?php if ($useDefList && ($info == 1 || $info == 2)) : ?> <div class="article-info muted"> <dl class="article-info"> <dt class="article-info-term"><?php echo JText::_('COM_CONTENT_ARTICLE_INFO'); ?></dt> <?php if ($info == 1) : ?> <?php if ($params->get('show_parent_category') && !empty($item->parent_slug)) : ?> <dd> <div class="parent-category-name"> <?php $title = $this->escape($item->parent_title); ?> <?php if ($params->get('link_parent_category') && $item->parent_slug) : ?> <?php $url = '<a href="' . JRoute::_(ContentHelperRoute::getCategoryRoute($item->parent_slug)) . '" itemprop="genre">' . $title . '</a>'; ?> <?php echo JText::sprintf('COM_CONTENT_PARENT', $url); ?> <?php else : ?> <?php echo JText::sprintf('COM_CONTENT_PARENT', '<span itemprop="genre">' . $title . '</span>'); ?> <?php endif; ?> </div> </dd> <?php endif; ?> <?php if ($params->get('show_category')) : ?> <dd> <div class="category-name"> <?php $title = $this->escape($item->category_title); ?> <?php if ($params->get('link_category') && $item->catslug) : ?> <?php $url = '<a href="' . JRoute::_(ContentHelperRoute::getCategoryRoute($item->catslug)) . '" itemprop="genre">' . $title . '</a>'; ?> <?php echo JText::sprintf('COM_CONTENT_CATEGORY', $url); ?> <?php else : ?> <?php echo JText::sprintf('COM_CONTENT_CATEGORY', '<span itemprop="genre">' . $title . '</span>'); ?> <?php endif; ?> </div> </dd> <?php endif; ?> <?php if ($params->get('show_publish_date')) : ?> <dd> <div class="published"> <span class="icon-calendar" aria-hidden="true"></span> <time datetime="<?php echo JHtml::_('date', $item->publish_up, 'c'); ?>" itemprop="datePublished"> <?php echo JText::sprintf('COM_CONTENT_PUBLISHED_DATE_ON', JHtml::_('date', $item->publish_up, JText::_('DATE_FORMAT_LC3'))); ?> </time> </div> </dd> <?php endif; ?> <?php endif; ?> <?php if ($params->get('show_create_date')) : ?> <dd> <div class="create"> <span class="icon-calendar" aria-hidden="true"></span> <time datetime="<?php echo JHtml::_('date', $item->created, 'c'); ?>" itemprop="dateCreated"> <?php echo JText::sprintf('COM_CONTENT_CREATED_DATE_ON', JHtml::_('date', $item->modified, JText::_('DATE_FORMAT_LC3'))); ?> </time> </div> </dd> <?php endif; ?> <?php if ($params->get('show_modify_date')) : ?> <dd> <div class="modified"> <span class="icon-calendar" aria-hidden="true"></span> <time datetime="<?php echo JHtml::_('date', $item->modified, 'c'); ?>" itemprop="dateModified"> <?php echo JText::sprintf('COM_CONTENT_LAST_UPDATED', JHtml::_('date', $item->modified, JText::_('DATE_FORMAT_LC3'))); ?> </time> </div> </dd> <?php endif; ?> <?php if ($params->get('show_hits')) : ?> <dd> <div class="hits"> <span class="icon-eye-open"></span> <meta content="UserPageVisits:<?php echo $item->hits; ?>" itemprop="interactionCount" /> <?php echo JText::sprintf('COM_CONTENT_ARTICLE_HITS', $item->hits); ?> </div> </dd> <?php endif; ?> </dl> </div> <?php endif; ?> <?php // Content is generated by content plugin event "onContentAfterDisplay" ?> <?php echo $item->event->afterDisplayContent; ?> </div> <?php endforeach; ?> </div> <div class="pagination"> <p class="counter"> <?php echo $this->pagination->getPagesCounter(); ?> </p> <?php echo $this->pagination->getPagesLinks(); ?> </div> tmpl/default.php 0000604 00000003412 15245536007 0007660 0 ustar 00 <?php /** * @package Joomla.Site * @subpackage com_content * * @copyright (C) 2006 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; JHtml::addIncludePath(JPATH_COMPONENT . '/helpers'); JHtml::_('formbehavior.chosen', 'select'); JHtml::_('behavior.caption'); ?> <div class="archive<?php echo $this->pageclass_sfx; ?>"> <?php if ($this->params->get('show_page_heading')) : ?> <div class="page-header"> <h1> <?php echo $this->escape($this->params->get('page_heading')); ?> </h1> </div> <?php endif; ?> <form id="adminForm" action="<?php echo JRoute::_('index.php'); ?>" method="post" class="form-inline"> <fieldset class="filters"> <div class="filter-search"> <?php if ($this->params->get('filter_field') !== 'hide') : ?> <label class="filter-search-lbl element-invisible" for="filter-search"><?php echo JText::_('COM_CONTENT_TITLE_FILTER_LABEL') . ' '; ?></label> <input type="text" name="filter-search" id="filter-search" value="<?php echo $this->escape($this->filter); ?>" class="inputbox span2" onchange="document.getElementById('adminForm').submit();" placeholder="<?php echo JText::_('COM_CONTENT_TITLE_FILTER_LABEL'); ?>" /> <?php endif; ?> <?php echo $this->form->monthField; ?> <?php echo $this->form->yearField; ?> <?php echo $this->form->limitField; ?> <button type="submit" class="btn btn-primary" style="vertical-align: top;"><?php echo JText::_('JGLOBAL_FILTER_BUTTON'); ?></button> <input type="hidden" name="view" value="archive" /> <input type="hidden" name="option" value="com_content" /> <input type="hidden" name="limitstart" value="0" /> </div> <br /> </fieldset> <?php echo $this->loadTemplate('items'); ?> </form> </div> tmpl/default.xml 0000604 00000017172 15245536007 0007701 0 ustar 00 <?xml version="1.0" encoding="utf-8"?> <metadata> <layout title="COM_CONTENT_ARCHIVE_VIEW_DEFAULT_TITLE" option="COM_CONTENT_ARCHIVE_VIEW_DEFAULT_OPTION"> <help key = "JHELP_MENUS_MENU_ITEM_ARTICLE_ARCHIVED" /> <message> <![CDATA[com_content_archive_view_default_desc]]> </message> </layout> <!-- Add fields to the request variables for the layout. --> <fields name="request"> <fieldset name="request" addfieldpath="/administrator/components/com_categories/models/fields" > <field name="catid" type="category" extension="com_content" multiple="true" size="5" label="JCATEGORY" description="JFIELD_CATEGORY_DESC" > <option value="">JOPTION_ALL_CATEGORIES</option> </field> </fieldset> </fields> <!-- Add fields to the parameters object for the layout. --> <fields name="params"> <!-- Basic options. --> <fieldset name="basic" label="JGLOBAL_ARCHIVE_OPTIONS" > <field name="orderby_sec" type="list" label="JGLOBAL_ARTICLE_ORDER_LABEL" description="JGLOBAL_ARTICLE_ORDER_DESC" default="alpha" > <option value="date">JGLOBAL_OLDEST_FIRST</option> <option value="rdate">JGLOBAL_MOST_RECENT_FIRST</option> <option value="alpha">JGLOBAL_TITLE_ALPHABETICAL</option> <option value="ralpha">JGLOBAL_TITLE_REVERSE_ALPHABETICAL</option> <option value="author">JGLOBAL_AUTHOR_ALPHABETICAL</option> <option value="rauthor">JGLOBAL_AUTHOR_REVERSE_ALPHABETICAL</option> <option value="hits">JGLOBAL_MOST_HITS</option> <option value="rhits">JGLOBAL_LEAST_HITS</option> <option value="order">JGLOBAL_ARTICLE_MANAGER_ORDER</option> <option value="vote" requires="vote">JGLOBAL_VOTES_DESC</option> <option value="rvote" requires="vote">JGLOBAL_VOTES_ASC</option> <option value="rank" requires="vote">JGLOBAL_RATINGS_DESC</option> <option value="rrank" requires="vote">JGLOBAL_RATINGS_ASC</option> </field> <field name="order_date" type="list" label="JGLOBAL_ORDERING_DATE_LABEL" description="JGLOBAL_ORDERING_DATE_DESC" default="created" > <option value="created">JGLOBAL_Created</option> <option value="modified">JGLOBAL_Modified</option> <option value="published">JPUBLISHED</option> </field> <field name="display_num" type="list" label="JGLOBAL_NUMBER_ITEMS_LIST_LABEL" description="JGLOBAL_NUMBER_ITEMS_LIST_DESC" default="5" > <option value="5">J5</option> <option value="10">J10</option> <option value="15">J15</option> <option value="20">J20</option> <option value="25">J25</option> <option value="30">J30</option> <option value="50">J50</option> <option value="100">J100</option> <option value="0">JALL</option> </field> <field name="filter_field" type="list" label="JGLOBAL_FILTER_FIELD_LABEL" description="JGLOBAL_FILTER_FIELD_DESC" default="" useglobal="true" > <option value="hide">JHIDE</option> <option value="1">JSHOW</option> </field> <field name="introtext_limit" type="number" label="JGLOBAL_ARCHIVE_ARTICLES_FIELD_INTROTEXTLIMIT_LABEL" description="JGLOBAL_ARCHIVE_ARTICLES_FIELD_INTROTEXTLIMIT_DESC" default="100" /> </fieldset> <!-- Articles options. --> <fieldset name="articles" label="COM_CONTENT_ATTRIBS_ARTICLE_SETTINGS_LABEL" > <field name="show_intro" type="list" label="JGLOBAL_SHOW_INTRO_LABEL" description="JGLOBAL_SHOW_INTRO_DESC" useglobal="true" class="chzn-color" > <option value="0">JHIDE</option> <option value="1">JSHOW</option> </field> <field name="info_block_position" type="list" label="COM_CONTENT_FIELD_INFOBLOCK_POSITION_LABEL" description="COM_CONTENT_FIELD_INFOBLOCK_POSITION_DESC" default="" useglobal="true" class="chzn-color" > <option value="use_article">COM_CONTENT_FIELD_VALUE_USE_ARTICLE_SETTINGS</option> <option value="0">COM_CONTENT_FIELD_OPTION_ABOVE</option> <option value="1">COM_CONTENT_FIELD_OPTION_BELOW</option> <option value="2">COM_CONTENT_FIELD_OPTION_SPLIT</option> </field> <field name="info_block_show_title" type="list" label="COM_CONTENT_FIELD_INFOBLOCK_TITLE_LABEL" description="COM_CONTENT_FIELD_INFOBLOCK_TITLE_DESC" useglobal="true" class="chzn-color" > <option value="0">JHIDE</option> <option value="1">JSHOW</option> </field> <field name="show_category" type="list" label="JGLOBAL_SHOW_CATEGORY_LABEL" description="JGLOBAL_SHOW_CATEGORY_DESC" useglobal="true" class="chzn-color" > <option value="0">JHIDE</option> <option value="1">JSHOW</option> </field> <field name="link_category" type="list" label="JGLOBAL_LINK_CATEGORY_LABEL" description="JGLOBAL_LINK_CATEGORY_DESC" useglobal="true" class="chzn-color" > <option value="0">JNO</option> <option value="1">JYES</option> </field> <field name="show_parent_category" type="list" label="JGLOBAL_SHOW_PARENT_CATEGORY_LABEL" description="JGLOBAL_SHOW_PARENT_CATEGORY_DESC" useglobal="true" > <option value="0">JHIDE</option> <option value="1">JSHOW</option> </field> <field name="link_parent_category" type="list" label="JGLOBAL_LINK_PARENT_CATEGORY_LABEL" description="JGLOBAL_LINK_PARENT_CATEGORY_DESC" useglobal="true" > <option value="0">JNO</option> <option value="1">JYES</option> </field> <field name="link_titles" type="list" label="JGLOBAL_LINKED_TITLES_LABEL" description="JGLOBAL_LINKED_TITLES_DESC" useglobal="true" class="chzn-color" > <option value="0">JNO</option> <option value="1">JYES</option> </field> <field name="show_author" type="list" label="JGLOBAL_SHOW_AUTHOR_LABEL" description="JGLOBAL_SHOW_AUTHOR_DESC" useglobal="true" class="chzn-color" > <option value="0">JHIDE</option> <option value="1">JSHOW</option> </field> <field name="link_author" type="list" label="JGLOBAL_LINK_AUTHOR_LABEL" description="JGLOBAL_LINK_AUTHOR_DESC" useglobal="true" > <option value="0">JNO</option> <option value="1">JYES</option> </field> <field name="show_create_date" type="list" label="JGLOBAL_SHOW_CREATE_DATE_LABEL" description="JGLOBAL_SHOW_CREATE_DATE_DESC" useglobal="true" class="chzn-color" > <option value="0">JHIDE</option> <option value="1">JSHOW</option> </field> <field name="show_modify_date" type="list" label="JGLOBAL_SHOW_MODIFY_DATE_LABEL" description="JGLOBAL_SHOW_MODIFY_DATE_DESC" useglobal="true" class="chzn-color" > <option value="0">JHIDE</option> <option value="1">JSHOW</option> </field> <field name="show_publish_date" type="list" label="JGLOBAL_SHOW_PUBLISH_DATE_LABEL" description="JGLOBAL_SHOW_PUBLISH_DATE_DESC" useglobal="true" class="chzn-color" > <option value="0">JHIDE</option> <option value="1">JSHOW</option> </field> <field name="show_item_navigation" type="list" label="JGLOBAL_SHOW_NAVIGATION_LABEL" description="JGLOBAL_SHOW_NAVIGATION_DESC" useglobal="true" class="chzn-color" > <option value="0">JHIDE</option> <option value="1">JSHOW</option> </field> <field name="show_hits" type="list" label="JGLOBAL_SHOW_HITS_LABEL" description="JGLOBAL_SHOW_HITS_DESC" useglobal="true" class="chzn-color" > <option value="0">JHIDE</option> <option value="1">JSHOW</option> </field> </fieldset> </fields> </metadata> archive.php 0000604 00000003627 15245561031 0006704 0 ustar 00 <?php /** * @package Joomla.Platform * @subpackage Archive * * @copyright (C) 2006 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE */ defined('JPATH_PLATFORM') or die; jimport('joomla.filesystem.file'); jimport('joomla.filesystem.folder'); use Joomla\Archive\Archive; /** * An Archive handling class * * @since 1.5 * @deprecated 4.0 use the Joomla\Archive\Archive class instead */ class JArchive { /** * The array of instantiated archive adapters. * * @var JArchiveExtractable[] * @since 3.0.0 */ protected static $adapters = array(); /** * Extract an archive file to a directory. * * @param string $archivename The name of the archive file * @param string $extractdir Directory to unpack into * * @return boolean True for success * * @since 1.5 * @throws InvalidArgumentException * @deprecated 4.0 use the Joomla\Archive\Archive class instead */ public static function extract($archivename, $extractdir) { // The archive instance $archive = new Archive(array('tmp_path' => JFactory::getConfig()->get('tmp_path'))); // Extract the archive return $archive->extract($archivename, $extractdir); } /** * Get a file compression adapter. * * @param string $type The type of adapter (bzip2|gzip|tar|zip). * * @return JArchiveExtractable Adapter for the requested type * * @since 1.5 * @throws UnexpectedValueException * @deprecated 4.0 use the Joomla\Archive\Archive class instead */ public static function getAdapter($type) { if (!isset(self::$adapters[$type])) { // Try to load the adapter object $class = 'JArchive' . ucfirst($type); if (!class_exists($class)) { throw new UnexpectedValueException('Unable to load archive', 500); } self::$adapters[$type] = new $class; } return self::$adapters[$type]; } } wrapper/archive.php 0000604 00000002522 15245561031 0010355 0 ustar 00 <?php /** * @package Joomla.Platform * @subpackage Archive * * @copyright (C) 2014 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE */ defined('JPATH_PLATFORM') or die; /** * Wrapper class for JArchive * * @package Joomla.Platform * @subpackage Archive * @since 3.4 * @deprecated 4.0 use the Joomla\Archive\Archive class instead */ class JArchiveWrapperArchive { /** * Helper wrapper method for extract * * @param string $archivename The name of the archive file * @param string $extractdir Directory to unpack into * * @return boolean True for success * * @see JArchive::extract() * @since 3.4 * @throws InvalidArgumentException * @deprecated 4.0 use the Joomla\Archive\Archive class instead */ public function extract($archivename, $extractdir) { return JArchive::extract($archivename, $extractdir); } /** * Helper wrapper method for getAdapter * * @param string $type The type of adapter (bzip2|gzip|tar|zip). * * @return JArchiveExtractable Adapter for the requested type * * @see JUserHelper::getAdapter() * @since 3.4 * @deprecated 4.0 use the Joomla\Archive\Archive class instead */ public function getAdapter($type) { return JArchive::getAdapter($type); } } zip.php 0000604 00000041600 15245561031 0006056 0 ustar 00 <?php /** * @package Joomla.Platform * @subpackage Archive * * @copyright (C) 2007 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE */ defined('JPATH_PLATFORM') or die; jimport('joomla.filesystem.file'); jimport('joomla.filesystem.folder'); /** * ZIP format adapter for the JArchive class * * The ZIP compression code is partially based on code from: * Eric Mueller <eric@themepark.com> * http://www.zend.com/codex.php?id=535&single=1 * * Deins125 <webmaster@atlant.ru> * http://www.zend.com/codex.php?id=470&single=1 * * The ZIP compression date code is partially based on code from * Peter Listiak <mlady@users.sourceforge.net> * * This class is inspired from and draws heavily in code and concept from the Compress package of * The Horde Project <https://www.horde.org> * * @contributor Chuck Hagenbuch <chuck@horde.org> * @contributor Michael Slusarz <slusarz@horde.org> * @contributor Michael Cochrane <mike@graftonhall.co.nz> * * @since 1.5 * @deprecated 4.0 use the Joomla\Archive\Zip class instead */ class JArchiveZip implements JArchiveExtractable { /** * ZIP compression methods. * * @var array * @since 1.5 */ private $_methods = array( 0x0 => 'None', 0x1 => 'Shrunk', 0x2 => 'Super Fast', 0x3 => 'Fast', 0x4 => 'Normal', 0x5 => 'Maximum', 0x6 => 'Imploded', 0x8 => 'Deflated', ); /** * Beginning of central directory record. * * @var string * @since 1.5 */ private $_ctrlDirHeader = "\x50\x4b\x01\x02"; /** * End of central directory record. * * @var string * @since 1.5 */ private $_ctrlDirEnd = "\x50\x4b\x05\x06\x00\x00\x00\x00"; /** * Beginning of file contents. * * @var string * @since 1.5 */ private $_fileHeader = "\x50\x4b\x03\x04"; /** * ZIP file data buffer * * @var string * @since 1.5 */ private $_data = null; /** * ZIP file metadata array * * @var array * @since 1.5 */ private $_metadata = null; /** * Create a ZIP compressed file from an array of file data. * * @param string $archive Path to save archive. * @param array $files Array of files to add to archive. * * @return boolean True if successful. * * @since 1.5 * * @todo Finish Implementation */ public function create($archive, $files) { $contents = array(); $ctrldir = array(); foreach ($files as $file) { $this->_addToZIPFile($file, $contents, $ctrldir); } return $this->_createZIPFile($contents, $ctrldir, $archive); } /** * Extract a ZIP compressed file to a given path * * @param string $archive Path to ZIP archive to extract * @param string $destination Path to extract archive into * @param array $options Extraction options [unused] * * @return boolean True if successful * * @since 1.5 * @throws RuntimeException */ public function extract($archive, $destination, array $options = array()) { if (!is_file($archive)) { return $this->raiseWarning(100, 'Archive does not exist'); } if ($this->hasNativeSupport()) { return $this->extractNative($archive, $destination); } return $this->extractCustom($archive, $destination); } /** * Temporary private method to isolate JError from the extract method * This code should be removed when JError is removed. * * @param int $code The application-internal error code for this error * @param string $msg The error message, which may also be shown the user if need be. * * @return JException JException instance if JError class exists * * @since 3.6.0 * @throws RuntimeException if JError class does not exist */ private function raiseWarning($code, $msg) { if (class_exists('JError')) { return JError::raiseWarning($code, $msg); } throw new RuntimeException($msg); } /** * Tests whether this adapter can unpack files on this computer. * * @return boolean True if supported * * @since 2.5.0 */ public static function isSupported() { return self::hasNativeSupport() || extension_loaded('zlib'); } /** * Method to determine if the server has native zip support for faster handling * * @return boolean True if php has native ZIP support * * @since 1.5 */ public static function hasNativeSupport() { return extension_loaded('zip'); } /** * Checks to see if the data is a valid ZIP file. * * @param string &$data ZIP archive data buffer. * * @return boolean True if valid, false if invalid. * * @since 1.5 */ public function checkZipData(&$data) { if (strpos($data, $this->_fileHeader) === false) { return false; } return true; } /** * Extract a ZIP compressed file to a given path using a php based algorithm that only requires zlib support * * @param string $archive Path to ZIP archive to extract. * @param string $destination Path to extract archive into. * * @return mixed True if successful * * @since 3.0 * @throws RuntimeException */ protected function extractCustom($archive, $destination) { $this->_data = null; $this->_metadata = null; if (!extension_loaded('zlib')) { return $this->raiseWarning(100, 'Zlib not supported'); } $this->_data = file_get_contents($archive); if (!$this->_data) { return $this->raiseWarning(100, 'Unable to read archive (zip)'); } if (!$this->_readZipInfo($this->_data)) { return $this->raiseWarning(100, 'Get ZIP Information failed'); } for ($i = 0, $n = count($this->_metadata); $i < $n; $i++) { $lastPathCharacter = substr($this->_metadata[$i]['name'], -1, 1); if ($lastPathCharacter !== '/' && $lastPathCharacter !== '\\') { $buffer = $this->_getFileData($i); $path = JPath::clean($destination . '/' . $this->_metadata[$i]['name']); if (strpos(JPath::clean(JPath::resolve($destination . '/' . $this->_metadata[$i]['name'])), JPath::clean(JPath::resolve($destination))) !== 0) { return $this->raiseWarning(100, 'Unable to write outside of destination path'); } // Make sure the destination folder exists if (!JFolder::create(dirname($path))) { return $this->raiseWarning(100, 'Unable to create destination'); } if (JFile::write($path, $buffer) === false) { return $this->raiseWarning(100, 'Unable to write entry'); } } } return true; } /** * Extract a ZIP compressed file to a given path using native php api calls for speed * * @param string $archive Path to ZIP archive to extract * @param string $destination Path to extract archive into * * @return boolean True on success * * @since 3.0 * @throws RuntimeException */ protected function extractNative($archive, $destination) { $zip = new \ZipArchive; if ($zip->open($archive) !== true) { return $this->raiseWarning(100, 'Unable to open archive'); } // Make sure the destination folder exists if (!JFolder::create($destination)) { return $this->raiseWarning(100, 'Unable to create destination'); } // Read files in the archive for ($index = 0; $index < $zip->numFiles; $index++) { $file = $zip->getNameIndex($index); if (substr($file, -1) === '/') { continue; } $buffer = $zip->getFromIndex($index); if ($buffer === false) { return $this->raiseWarning(100, 'Unable to read entry'); } if (strpos(JPath::clean(JPath::resolve($destination . '/' . $file)), JPath::clean(JPath::resolve($destination))) !== 0) { return $this->raiseWarning(100, 'Unable to write outside of destination path'); } if (JFile::write($destination . '/' . $file, $buffer) === false) { return $this->raiseWarning(100, 'Unable to write entry'); } } $zip->close(); return true; } /** * Get the list of files/data from a ZIP archive buffer. * * <pre> * KEY: Position in zipfile * VALUES: 'attr' -- File attributes * 'crc' -- CRC checksum * 'csize' -- Compressed file size * 'date' -- File modification time * 'name' -- Filename * 'method'-- Compression method * 'size' -- Original file size * 'type' -- File type * </pre> * * @param string &$data The ZIP archive buffer. * * @return boolean True on success * * @since 2.5.0 * @throws RuntimeException */ private function _readZipInfo(&$data) { $entries = array(); // Find the last central directory header entry $fhLast = strpos($data, $this->_ctrlDirEnd); do { $last = $fhLast; } while (($fhLast = strpos($data, $this->_ctrlDirEnd, $fhLast + 1)) !== false); // Find the central directory offset $offset = 0; if ($last) { $endOfCentralDirectory = unpack( 'vNumberOfDisk/vNoOfDiskWithStartOfCentralDirectory/vNoOfCentralDirectoryEntriesOnDisk/' . 'vTotalCentralDirectoryEntries/VSizeOfCentralDirectory/VCentralDirectoryOffset/vCommentLength', substr($data, $last + 4) ); $offset = $endOfCentralDirectory['CentralDirectoryOffset']; } // Get details from central directory structure. $fhStart = strpos($data, $this->_ctrlDirHeader, $offset); $dataLength = strlen($data); do { if ($dataLength < $fhStart + 31) { return $this->raiseWarning(100, 'Invalid Zip Data'); } $info = unpack('vMethod/VTime/VCRC32/VCompressed/VUncompressed/vLength', substr($data, $fhStart + 10, 20)); $name = substr($data, $fhStart + 46, $info['Length']); $entries[$name] = array( 'attr' => null, 'crc' => sprintf('%08s', dechex($info['CRC32'])), 'csize' => $info['Compressed'], 'date' => null, '_dataStart' => null, 'name' => $name, 'method' => $this->_methods[$info['Method']], '_method' => $info['Method'], 'size' => $info['Uncompressed'], 'type' => null, ); $entries[$name]['date'] = mktime( (($info['Time'] >> 11) & 0x1f), (($info['Time'] >> 5) & 0x3f), (($info['Time'] << 1) & 0x3e), (($info['Time'] >> 21) & 0x07), (($info['Time'] >> 16) & 0x1f), ((($info['Time'] >> 25) & 0x7f) + 1980) ); if ($dataLength < $fhStart + 43) { return $this->raiseWarning(100, 'Invalid ZIP data'); } $info = unpack('vInternal/VExternal/VOffset', substr($data, $fhStart + 36, 10)); $entries[$name]['type'] = ($info['Internal'] & 0x01) ? 'text' : 'binary'; $entries[$name]['attr'] = (($info['External'] & 0x10) ? 'D' : '-') . (($info['External'] & 0x20) ? 'A' : '-') . (($info['External'] & 0x03) ? 'S' : '-') . (($info['External'] & 0x02) ? 'H' : '-') . (($info['External'] & 0x01) ? 'R' : '-'); $entries[$name]['offset'] = $info['Offset']; // Get details from local file header since we have the offset $lfhStart = strpos($data, $this->_fileHeader, $entries[$name]['offset']); if ($dataLength < $lfhStart + 34) { return $this->raiseWarning(100, 'Invalid Zip Data'); } $info = unpack('vMethod/VTime/VCRC32/VCompressed/VUncompressed/vLength/vExtraLength', substr($data, $lfhStart + 8, 25)); $name = substr($data, $lfhStart + 30, $info['Length']); $entries[$name]['_dataStart'] = $lfhStart + 30 + $info['Length'] + $info['ExtraLength']; // Bump the max execution time because not using the built in php zip libs makes this process slow. @set_time_limit(ini_get('max_execution_time')); } while ((($fhStart = strpos($data, $this->_ctrlDirHeader, $fhStart + 46)) !== false)); $this->_metadata = array_values($entries); return true; } /** * Returns the file data for a file by offset in the ZIP archive * * @param integer $key The position of the file in the archive. * * @return string Uncompressed file data buffer. * * @since 1.5 */ private function _getFileData($key) { $method = $this->_metadata[$key]['_method']; if ($method == 0x12 && !extension_loaded('bz2')) { return ''; } switch ($method) { case 0x8: return gzinflate(substr($this->_data, $this->_metadata[$key]['_dataStart'], $this->_metadata[$key]['csize'])); case 0x0: // Files that aren't compressed. return substr($this->_data, $this->_metadata[$key]['_dataStart'], $this->_metadata[$key]['csize']); case 0x12: return bzdecompress(substr($this->_data, $this->_metadata[$key]['_dataStart'], $this->_metadata[$key]['csize'])); } return ''; } /** * Converts a UNIX timestamp to a 4-byte DOS date and time format * (date in high 2-bytes, time in low 2-bytes allowing magnitude * comparison). * * @param int $unixtime The current UNIX timestamp. * * @return int The current date in a 4-byte DOS format. * * @since 1.5 */ protected function _unix2DOSTime($unixtime = null) { $timearray = (is_null($unixtime)) ? getdate() : getdate($unixtime); if ($timearray['year'] < 1980) { $timearray['year'] = 1980; $timearray['mon'] = 1; $timearray['mday'] = 1; $timearray['hours'] = 0; $timearray['minutes'] = 0; $timearray['seconds'] = 0; } return (($timearray['year'] - 1980) << 25) | ($timearray['mon'] << 21) | ($timearray['mday'] << 16) | ($timearray['hours'] << 11) | ($timearray['minutes'] << 5) | ($timearray['seconds'] >> 1); } /** * Adds a "file" to the ZIP archive. * * @param array &$file File data array to add * @param array &$contents An array of existing zipped files. * @param array &$ctrldir An array of central directory information. * * @return void * * @since 1.5 * * @todo Review and finish implementation */ private function _addToZIPFile(array &$file, array &$contents, array &$ctrldir) { $data = &$file['data']; $name = str_replace('\\', '/', $file['name']); /* See if time/date information has been provided. */ $ftime = null; if (isset($file['time'])) { $ftime = $file['time']; } // Get the hex time. $dtime = dechex($this->_unix2DosTime($ftime)); $hexdtime = chr(hexdec($dtime[6] . $dtime[7])) . chr(hexdec($dtime[4] . $dtime[5])) . chr(hexdec($dtime[2] . $dtime[3])) . chr(hexdec($dtime[0] . $dtime[1])); /* Begin creating the ZIP data. */ $fr = $this->_fileHeader; /* Version needed to extract. */ $fr .= "\x14\x00"; /* General purpose bit flag. */ $fr .= "\x00\x00"; /* Compression method. */ $fr .= "\x08\x00"; /* Last modification time/date. */ $fr .= $hexdtime; /* "Local file header" segment. */ $unc_len = strlen($data); $crc = crc32($data); $zdata = gzcompress($data); $zdata = substr(substr($zdata, 0, strlen($zdata) - 4), 2); $c_len = strlen($zdata); /* CRC 32 information. */ $fr .= pack('V', $crc); /* Compressed filesize. */ $fr .= pack('V', $c_len); /* Uncompressed filesize. */ $fr .= pack('V', $unc_len); /* Length of filename. */ $fr .= pack('v', strlen($name)); /* Extra field length. */ $fr .= pack('v', 0); /* File name. */ $fr .= $name; /* "File data" segment. */ $fr .= $zdata; /* Add this entry to array. */ $old_offset = strlen(implode('', $contents)); $contents[] = &$fr; /* Add to central directory record. */ $cdrec = $this->_ctrlDirHeader; /* Version made by. */ $cdrec .= "\x00\x00"; /* Version needed to extract */ $cdrec .= "\x14\x00"; /* General purpose bit flag */ $cdrec .= "\x00\x00"; /* Compression method */ $cdrec .= "\x08\x00"; /* Last mod time/date. */ $cdrec .= $hexdtime; /* CRC 32 information. */ $cdrec .= pack('V', $crc); /* Compressed filesize. */ $cdrec .= pack('V', $c_len); /* Uncompressed filesize. */ $cdrec .= pack('V', $unc_len); /* Length of filename. */ $cdrec .= pack('v', strlen($name)); /* Extra field length. */ $cdrec .= pack('v', 0); /* File comment length. */ $cdrec .= pack('v', 0); /* Disk number start. */ $cdrec .= pack('v', 0); /* Internal file attributes. */ $cdrec .= pack('v', 0); /* External file attributes -'archive' bit set. */ $cdrec .= pack('V', 32); /* Relative offset of local header. */ $cdrec .= pack('V', $old_offset); /* File name. */ $cdrec .= $name; /* Optional extra field, file comment goes here. */ /* Save to central directory array. */ $ctrldir[] = &$cdrec; } /** * Creates the ZIP file. * * Official ZIP file format: https://support.pkware.com/display/PKZIP/APPNOTE * * @param array &$contents An array of existing zipped files. * @param array &$ctrlDir An array of central directory information. * @param string $path The path to store the archive. * * @return boolean True if successful * * @since 1.5 * * @todo Review and finish implementation */ private function _createZIPFile(array &$contents, array &$ctrlDir, $path) { $data = implode('', $contents); $dir = implode('', $ctrlDir); $buffer = $data . $dir . $this->_ctrlDirEnd . /* Total # of entries "on this disk". */ pack('v', count($ctrlDir)) . /* Total # of entries overall. */ pack('v', count($ctrlDir)) . /* Size of central directory. */ pack('V', strlen($dir)) . /* Offset to start of central dir. */ pack('V', strlen($data)) . /* ZIP file comment length. */ "\x00\x00"; if (JFile::write($path, $buffer) === false) { return false; } return true; } } gzip.php 0000604 00000012344 15245561031 0006230 0 ustar 00 <?php /** * @package Joomla.Platform * @subpackage Archive * * @copyright (C) 2007 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE */ defined('JPATH_PLATFORM') or die; jimport('joomla.filesystem.file'); /** * Gzip format adapter for the JArchive class * * This class is inspired from and draws heavily in code and concept from the Compress package of * The Horde Project <https://www.horde.org> * * @contributor Michael Slusarz <slusarz@horde.org> * @contributor Michael Cochrane <mike@graftonhall.co.nz> * * @since 1.5 * @deprecated 4.0 use the Joomla\Archive\Gzip class instead */ class JArchiveGzip implements JArchiveExtractable { /** * Gzip file flags. * * @var array * @since 1.5 */ private $_flags = array('FTEXT' => 0x01, 'FHCRC' => 0x02, 'FEXTRA' => 0x04, 'FNAME' => 0x08, 'FCOMMENT' => 0x10); /** * Gzip file data buffer * * @var string * @since 1.5 */ private $_data = null; /** * Extract a Gzip compressed file to a given path * * @param string $archive Path to ZIP archive to extract * @param string $destination Path to extract archive to * @param array $options Extraction options [unused] * * @return boolean True if successful * * @since 1.5 * @throws RuntimeException */ public function extract($archive, $destination, array $options = array()) { $this->_data = null; if (!extension_loaded('zlib')) { return $this->raiseWarning(100, 'The zlib extension is not available.'); } if (isset($options['use_streams']) && $options['use_streams'] != false) { return $this->extractStream($archive, $destination, $options); } $this->_data = file_get_contents($archive); if (!$this->_data) { return $this->raiseWarning(100, 'Unable to read archive'); } $position = $this->_getFilePosition(); $buffer = gzinflate(substr($this->_data, $position, strlen($this->_data) - $position)); if (empty($buffer)) { return $this->raiseWarning(100, 'Unable to decompress data'); } if (JFile::write($destination, $buffer) === false) { return $this->raiseWarning(100, 'Unable to write archive'); } return true; } /** * Method to extract archive using stream objects * * @param string $archive Path to ZIP archive to extract * @param string $destination Path to extract archive to * @param array $options Extraction options [unused] * * @return boolean True if successful * * @since 3.6.0 */ protected function extractStream($archive, $destination, $options = array()) { // New style! streams! $input = JFactory::getStream(); // Use gz $input->set('processingmethod', 'gz'); if (!$input->open($archive)) { return $this->raiseWarning(100, 'Unable to read archive (gz)'); } $output = JFactory::getStream(); if (!$output->open($destination, 'w')) { $input->close(); return $this->raiseWarning(100, 'Unable to write archive (gz)'); } do { $this->_data = $input->read($input->get('chunksize', 8196)); if ($this->_data && !$output->write($this->_data)) { $input->close(); return $this->raiseWarning(100, 'Unable to write file (gz)'); } } while ($this->_data); $output->close(); $input->close(); return true; } /** * Temporary private method to isolate JError from the extract method * This code should be removed when JError is removed. * * @param int $code The application-internal error code for this error * @param string $msg The error message, which may also be shown the user if need be. * * @return JException JException instance if JError class exists * * @since 3.6.0 * @throws RuntimeException if JError class does not exist */ private function raiseWarning($code, $msg) { if (class_exists('JError')) { return JError::raiseWarning($code, $msg); } throw new RuntimeException($msg); } /** * Tests whether this adapter can unpack files on this computer. * * @return boolean True if supported * * @since 2.5.0 */ public static function isSupported() { return extension_loaded('zlib'); } /** * Get file data offset for archive * * @return integer Data position marker for archive * * @since 1.5 * @throws RuntimeException */ public function _getFilePosition() { // Gzipped file... unpack it first $position = 0; $info = @ unpack('CCM/CFLG/VTime/CXFL/COS', substr($this->_data, $position + 2)); if (!$info) { return $this->raiseWarning(100, 'Unable to decompress data.'); } $position += 10; if ($info['FLG'] & $this->_flags['FEXTRA']) { $XLEN = unpack('vLength', substr($this->_data, $position + 0, 2)); $XLEN = $XLEN['Length']; $position += $XLEN + 2; } if ($info['FLG'] & $this->_flags['FNAME']) { $filenamePos = strpos($this->_data, "\x0", $position); $position = $filenamePos + 1; } if ($info['FLG'] & $this->_flags['FCOMMENT']) { $commentPos = strpos($this->_data, "\x0", $position); $position = $commentPos + 1; } if ($info['FLG'] & $this->_flags['FHCRC']) { $hcrc = unpack('vCRC', substr($this->_data, $position + 0, 2)); $hcrc = $hcrc['CRC']; $position += 2; } return $position; } } bzip2.php 0000604 00000007366 15245561031 0006315 0 ustar 00 <?php /** * @package Joomla.Platform * @subpackage Archive * * @copyright (C) 2007 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE */ defined('JPATH_PLATFORM') or die; jimport('joomla.filesystem.file'); jimport('joomla.filesystem.stream'); /** * Bzip2 format adapter for the JArchive class * * @since 1.5 * @deprecated 4.0 use the Joomla\Archive\Bzip2 class instead */ class JArchiveBzip2 implements JArchiveExtractable { /** * Bzip2 file data buffer * * @var string * @since 1.5 */ private $_data = null; /** * Extract a Bzip2 compressed file to a given path * * @param string $archive Path to Bzip2 archive to extract * @param string $destination Path to extract archive to * @param array $options Extraction options [unused] * * @return boolean True if successful * * @since 1.5 * @throws RuntimeException */ public function extract($archive, $destination, array $options = array()) { $this->_data = null; if (!extension_loaded('bz2')) { $this->raiseWarning(100, 'The bz2 extension is not available.'); } if (isset($options['use_streams']) && $options['use_streams'] != false) { return $this->extractStream($archive, $destination, $options); } // Old style: read the whole file and then parse it $this->_data = file_get_contents($archive); if (!$this->_data) { return $this->raiseWarning(100, 'Unable to read archive'); } $buffer = bzdecompress($this->_data); unset($this->_data); if (empty($buffer)) { return $this->raiseWarning(100, 'Unable to decompress data'); } if (JFile::write($destination, $buffer) === false) { return $this->raiseWarning(100, 'Unable to write archive'); } return true; } /** * Method to extract archive using stream objects * * @param string $archive Path to Bzip2 archive to extract * @param string $destination Path to extract archive to * @param array $options Extraction options [unused] * * @return boolean True if successful * * @since 3.6.0 */ protected function extractStream($archive, $destination, $options = array()) { // New style! streams! $input = JFactory::getStream(); // Use bzip $input->set('processingmethod', 'bz'); if (!$input->open($archive)) { return $this->raiseWarning(100, 'Unable to read archive (bz2)'); } $output = JFactory::getStream(); if (!$output->open($destination, 'w')) { $input->close(); return $this->raiseWarning(100, 'Unable to write archive (bz2)'); } do { $this->_data = $input->read($input->get('chunksize', 8196)); if ($this->_data && !$output->write($this->_data)) { $input->close(); return $this->raiseWarning(100, 'Unable to write archive (bz2)'); } } while ($this->_data); $output->close(); $input->close(); return true; } /** * Temporary private method to isolate JError from the extract method * This code should be removed when JError is removed. * * @param int $code The application-internal error code for this error * @param string $msg The error message, which may also be shown the user if need be. * * @return JException JException instance if JError class exists * * @since 3.6.0 * @throws RuntimeException if JError class does not exist */ private function raiseWarning($code, $msg) { if (class_exists('JError')) { return JError::raiseWarning($code, $msg); } throw new RuntimeException($msg); } /** * Tests whether this adapter can unpack files on this computer. * * @return boolean True if supported * * @since 2.5.0 */ public static function isSupported() { return extension_loaded('bz2'); } } extractable.php 0000604 00000001772 15245561031 0007560 0 ustar 00 <?php /** * @package Joomla.Platform * @subpackage Archive * * @copyright (C) 2012 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE */ defined('JPATH_PLATFORM') or die; /** * Archieve class interface * * @since 3.0.0 * @deprecated 4.0 use the Joomla\Archive\ExtractableInterface interface instead */ interface JArchiveExtractable { /** * Extract a compressed file to a given path * * @param string $archive Path to archive to extract * @param string $destination Path to extract archive to * @param array $options Extraction options [may be unused] * * @return boolean True if successful * * @since 3.0.0 */ public function extract($archive, $destination, array $options = array()); /** * Tests whether this adapter can unpack files on this computer. * * @return boolean True if supported * * @since 3.0.0 */ public static function isSupported(); } tar.php 0000604 00000015104 15245561031 0006042 0 ustar 00 <?php /** * @package Joomla.Platform * @subpackage Archive * * @copyright (C) 2007 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE */ defined('JPATH_PLATFORM') or die; jimport('joomla.filesystem.file'); jimport('joomla.filesystem.folder'); jimport('joomla.filesystem.path'); /** * Tar format adapter for the JArchive class * * This class is inspired from and draws heavily in code and concept from the Compress package of * The Horde Project <https://www.horde.org> * * @contributor Michael Slusarz <slusarz@horde.org> * @contributor Michael Cochrane <mike@graftonhall.co.nz> * * @since 1.5 * @deprecated 4.0 use the Joomla\Archive\Tar class instead */ class JArchiveTar implements JArchiveExtractable { /** * Tar file types. * * @var array * @since 1.5 */ private $_types = array( 0x0 => 'Unix file', 0x30 => 'File', 0x31 => 'Link', 0x32 => 'Symbolic link', 0x33 => 'Character special file', 0x34 => 'Block special file', 0x35 => 'Directory', 0x36 => 'FIFO special file', 0x37 => 'Contiguous file', ); /** * Tar file data buffer * * @var string * @since 1.5 */ private $_data = null; /** * Tar file metadata array * * @var array * @since 1.5 */ private $_metadata = null; /** * Extract a ZIP compressed file to a given path * * @param string $archive Path to ZIP archive to extract * @param string $destination Path to extract archive into * @param array $options Extraction options [unused] * * @return boolean|JException True on success, JException instance on failure if JError class exists * * @since 1.5 * @throws RuntimeException if JError class does not exist */ public function extract($archive, $destination, array $options = array()) { $this->_data = null; $this->_metadata = null; $this->_data = file_get_contents($archive); if (!$this->_data) { if (class_exists('JError')) { return JError::raiseWarning(100, 'Unable to read archive'); } else { throw new RuntimeException('Unable to read archive'); } } $this->_getTarInfo($this->_data); for ($i = 0, $n = count($this->_metadata); $i < $n; $i++) { $type = strtolower($this->_metadata[$i]['type']); if ($type == 'file' || $type == 'unix file') { $buffer = $this->_metadata[$i]['data']; $path = JPath::clean($destination . '/' . $this->_metadata[$i]['name']); if (strpos(JPath::clean(JPath::resolve($destination . '/' . $this->_metadata[$i]['name'])), JPath::clean(JPath::resolve($destination))) !== 0) { if (class_exists('JError')) { return JError::raiseWarning(100, 'Unable to write outside of destination path'); } else { throw new RuntimeException('Unable to write outside of destination path'); } } // Make sure the destination folder exists if (!JFolder::create(dirname($path))) { if (class_exists('JError')) { return JError::raiseWarning(100, 'Unable to create destination'); } else { throw new RuntimeException('Unable to create destination'); } } if (JFile::write($path, $buffer) === false) { if (class_exists('JError')) { return JError::raiseWarning(100, 'Unable to write entry'); } else { throw new RuntimeException('Unable to write entry'); } } } } return true; } /** * Tests whether this adapter can unpack files on this computer. * * @return boolean True if supported * * @since 2.5.0 */ public static function isSupported() { return true; } /** * Get the list of files/data from a Tar archive buffer. * * @param string &$data The Tar archive buffer. * * @return boolean|JException True on success, JException instance on failure if JError class exists * * @since 1.5 * @throws RuntimeException if JError class does not exist */ protected function _getTarInfo(& $data) { $position = 0; $return_array = array(); while ($position < strlen($data)) { if (version_compare(PHP_VERSION, '5.5', '>=')) { $info = @unpack( 'Z100filename/Z8mode/Z8uid/Z8gid/Z12size/Z12mtime/Z8checksum/Ctypeflag/Z100link/Z6magic/Z2version/Z32uname/Z32gname/Z8devmajor/Z8devminor', substr($data, $position) ); } else { $info = @unpack( 'a100filename/a8mode/a8uid/a8gid/a12size/a12mtime/a8checksum/Ctypeflag/a100link/a6magic/a2version/a32uname/a32gname/a8devmajor/a8devminor', substr($data, $position) ); } /** * This variable has been set in the previous loop, * meaning that the filename was present in the previous block * to allow more than 100 characters - see below */ if (isset($longlinkfilename)) { $info['filename'] = $longlinkfilename; unset($longlinkfilename); } if (!$info) { if (class_exists('JError')) { return JError::raiseWarning(100, 'Unable to decompress data'); } else { throw new RuntimeException('Unable to decompress data'); } } $position += 512; $contents = substr($data, $position, octdec($info['size'])); $position += ceil(octdec($info['size']) / 512) * 512; if ($info['filename']) { $file = array( 'attr' => null, 'data' => null, 'date' => octdec($info['mtime']), 'name' => trim($info['filename']), 'size' => octdec($info['size']), 'type' => isset($this->_types[$info['typeflag']]) ? $this->_types[$info['typeflag']] : null, ); if (($info['typeflag'] == 0) || ($info['typeflag'] == 0x30) || ($info['typeflag'] == 0x35)) { // File or folder. $file['data'] = $contents; $mode = hexdec(substr($info['mode'], 4, 3)); $file['attr'] = (($info['typeflag'] == 0x35) ? 'd' : '-') . (($mode & 0x400) ? 'r' : '-') . (($mode & 0x200) ? 'w' : '-') . (($mode & 0x100) ? 'x' : '-') . (($mode & 0x040) ? 'r' : '-') . (($mode & 0x020) ? 'w' : '-') . (($mode & 0x010) ? 'x' : '-') . (($mode & 0x004) ? 'r' : '-') . (($mode & 0x002) ? 'w' : '-') . (($mode & 0x001) ? 'x' : '-'); } elseif (chr($info['typeflag']) == 'L' && $info['filename'] == '././@LongLink') { // GNU tar ././@LongLink support - the filename is actually in the contents, // setting a variable here so we can test in the next loop $longlinkfilename = $contents; // And the file contents are in the next block so we'll need to skip this continue; } else { // Some other type. } $return_array[] = $file; } } $this->_metadata = $return_array; return true; } } index.html 0000604 00000000054 15245613453 0006544 0 ustar 00 <html><body bgcolor="#FFFFFF"></body></html>