*  @copyright Copyright (C) 2014. All Rights Reserved *  @license GNU/GPL Version 2 or later - http://www.gnu.org/licenses/gpl-2.0.html * **/ // No direct access to this file defined('_JEXEC') or die('Restricted access'); ?> ###BOM### // No direct access to this file defined('_JEXEC') or die('Restricted access'); /** * Dropbox updater component helper */ class Dropboxupdater { /** * to see where we are in the prosses **/ public $progress = array('report' => 0); /** * update flag (if false update will not happen) **/ protected $okay = true; /** * the type of linksto update **/ protected $type; /** * allow a forced manual update **/ protected $runManual; /** * Todays date-time **/ protected $today; /** * Next updat date-time **/ protected $next; /** * update method **/ protected $updateMethod; /** * update links **/ protected $updateLinks = array(); /** * Listing of dropbox links **/ protected $listing = array(); /** * info related to this update **/ protected $updateInfo; protected $infoFilePath; /** * get the localkey **/ protected $localkey = false; /** * component parameters **/ protected $app_params; /** * everything we want done when initialized **/ public function __construct() { // get params $this->app_params = JComponentHelper::getParams('com_###component###'); // set local key $this->localkey = md5($this->app_params->get('link_encryption', 'localKey34fdWEkl')); } /** * update mehtod **/ public function update($type = false, $runManual = false) { if ($type) { // start frech $this->okay = true; // set type $this->type = $type; $this->runManual = $runManual; // set progress file name $this->progressFilePath = JPATH_COMPONENT_SITE.'/helpers/'.md5($this->type.'progress'.$this->localkey).'.json'; // what update method is set $this->setUpdateMethod(); // set the update links $this->setUpdateLinks(); // set needed dates if ($this->okay) { $this->setDates(); } // get info data or set if not found if ($this->okay) { $this->setInfoData(); } // check if update should run now if ($this->okay) { $this->checkUpdateStatus(); } // set progress if ($this->okay) { $this->saveProgress(); } // before update save update info incase class is called again if($this->okay) { if ($this->updateInfo->updatenow) { // turn update to active $this->updateInfo->updatenow = false; $this->updateInfo->updateactive = true; // now save the date $this->okay = $this->saveUpdateInfo(); } else { $this->okay = false; } } // run the update if all is okay if ($this->okay) { // set the config $this->setDropboxConfig(); // set progress $this->progress['report'] = 30; $this->saveProgress(); // load the file JLoader::import('dropbox', JPATH_COMPONENT_SITE.'/helpers'); // okay now update if ($this->doUpdate()) { return $this->okay; } } } return false; } /** * set update mehtod **/ protected function setUpdateMethod() { $method = $this->app_params->get($this->type.'_link_update_method', 0); if ($this->runManual) { // this is a manual method $this->updateMethod = 'manual'; } elseif (2 == $method) { // this it an auto mehtod $this->updateMethod = 'auto'; } else { $this->okay = false; } } /** * set update Links **/ protected function setUpdateLinks() { // the number of links $numbers = range(1, 4); // now check if they are set foreach ($numbers as $number) { // set the number to string $numStr = ###Component###Helper::safeString($number); // Get the url $url = $this->app_params->get($this->type.'dropbox'.$numStr, null); // only load those that are set if ($url) { $this->updateLinks[] = $url; } } // check if we found any if (!isset($this->updateLinks) || !###Component###Helper::checkArray($this->updateLinks)) { $this->okay = false; } } /** * set next update time **/ protected function setDates() { // set todays date/time $this->today = time(); // set the next update date/time if ('manual' == $this->updateMethod) { // set the date to two days ago to ensure the update runs now $this->next = strtotime("-2 days"); } else { // based on the auto time we will set the next update date/time $timer = $this->app_params->get($this->type.'_dropbox_timer', '60'); if ($timer != 0) { // Get Next Update Time $this->next = strtotime('+'.$timer.' minutes', $this->today); } // if timer is 0 we should not update else { $this->okay = false; } } } /** * set update mehtod **/ protected function setInfoData() { // set the info file name $fileName = md5($this->type.'info'.$this->localkey); // set file path $this->infoFilePath = JPATH_COMPONENT_SITE.'/helpers/'.$fileName.'.json'; if (($json = @file_get_contents($this->infoFilePath)) !== FALSE) { $this->updateInfo = json_decode($json); } else { $this->updateInfo = new stdClass; $this->updateInfo->nextupdate = 0; $this->updateInfo->updateactive = false; $this->updateInfo->updatenow = false; } } /** * check update status **/ protected function checkUpdateStatus() { // check if there is already an update running if ($this->updateInfo->updateactive) { $this->okay = false; } // check if the time has come to do the next update elseif (('auto' == $this->updateMethod) && ($this->updateInfo->nextupdate > $this->today)) { $this->okay = false; } else { $this->updateInfo->updatenow = true; } } /** * save the update info **/ protected function saveProgress() { return $this->saveJson(json_encode($this->progress),$this->progressFilePath); } /** * save the update info **/ protected function saveUpdateInfo() { return $this->saveJson(json_encode($this->updateInfo),$this->infoFilePath); } /** * update the local listing **/ protected function doUpdate() { // we need more then the normal time to run this script 5 minutes at least. ini_set('max_execution_time', 500); // get data of all the urls foreach ($this->updateLinks as $mainUrl) { // set progress if ($this->progress['report'] < 60) { $this->progress['report'] = $this->progress['report'] + 5; $this->saveProgress(); } // get ldropbox links $dropbox = new Dropbox($mainUrl, $this->dropboxConfig); // set progress if ($this->progress['report'] < 70) { $this->progress['report'] = $this->progress['report'] + 5; $this->saveProgress(); } // get the links if (###Component###Helper::checkArray($dropbox->files)) { $this->listing = array_merge($this->listing, $dropbox->files); } // set progress if ($this->progress['report'] < 80) { $this->progress['report'] = $this->progress['report'] + 5; $this->saveProgress(); } unset($dropbox); } // now store the new listing return $this->setNewListing(); } protected function setNewListing() { // set progress $this->progress['report'] = 100; $this->saveProgress(); // reset storage $storeage = array(); // set the listing file name $fileName = md5($this->type.'listing'.$this->localkey); // set file path $listingFilePath = JPATH_COMPONENT_SITE.'/helpers/'.$fileName.'.json'; // now store the new listing if (###Component###Helper::checkArray($this->listing)) { // encrypt the urls $locker = new FOFEncryptAes($this->localkey, 256); foreach ($this->listing as $folder => $link) { $storeage[$folder] = base64_encode($locker->encryptString($link)); } } else { $this->okay = false; } // save the update links. $this->saveJson(json_encode($storeage),$listingFilePath); // make sure the update reset $this->updateInfo->nextupdate = $this->next; $this->updateInfo->updateactive = false; $this->updateInfo->updatenow = false; return $this->saveUpdateInfo(); } /** * set the configeration for dropbox class **/ protected function setDropboxConfig() { // reset config $this->dropboxConfig = array(); // get the legal files set $getfiles = $this->app_params->get('dropbox_filetypes', null); if (###Component###Helper::checkArray($getfiles)) { $this->dropboxConfig['get'] = $getfiles; } // set other config settings $this->dropboxConfig['save'] = false; $this->dropboxConfig['download'] = false; } protected function saveJson($data,$filename) { if (###Component###Helper::checkString($data)) { $fp = fopen($filename, 'w'); fwrite($fp, $data); fclose($fp); return true; } return false; } }