/** * Import an emoticon pack * * @return @e void */ public function emoticonsPackImport() { /* Make sure all emoticon directories are writable */ $this->DB->build(array('select' => $this->DB->buildDistinct('emo_set') . ' as folder', 'from' => 'emoticons')); $this->DB->execute(); while ($r = $this->DB->fetch()) { $_folders[] = $r['folder']; } if (count($_folders)) { foreach ($_folders as $folder) { if (!IPSLib::isWritable(DOC_IPS_ROOT_PATH . PUBLIC_DIRECTORY . '/style_emoticons/' . $folder)) { $this->registry->output->global_error = sprintf($this->lang->words['emodir_not_write'], PUBLIC_DIRECTORY . '/style_emoticons/' . $folder); return $this->emoticonsPackSplash(); } } } /* Get the xml file */ try { $content = $this->registry->adminFunctions->importXml('ipb_emoticons.xml'); } catch (Exception $e) { $this->registry->output->showError($e->getMessage()); } /* Check for content */ if (!$content) { $this->registry->output->global_error = $this->lang->words['emo_fail']; return $this->emoticonsPackSplash(); } /* Setup XML */ require_once IPS_KERNEL_PATH . 'classXML.php'; /*noLibHook*/ $xml = new classXML(IPS_DOC_CHAR_SET); require_once IPS_KERNEL_PATH . 'classXMLArchive.php'; /*noLibHook*/ $xmlarchive = new classXMLArchive(); /* Read the archive */ $xmlarchive->readXML($content); /* Get the data file */ $emoticons = array(); $emoticon_data = array(); foreach ($xmlarchive->asArray() as $k => $f) { if ($k == 'emoticon_data.xml') { $emoticon_data = $f; } else { $emoticons[$f['filename']] = $f['content']; } } /* Parse the XML Document */ $xml->loadXML($emoticon_data['content']); /* Make sure we have a destination for these emoicons */ if (!$this->request['emo_set'] and !$this->request['new_emo_set']) { $this->registry->output->global_error = $this->lang->words['emo_specify']; } /* Current emoticon set directory */ $emo_set_dir = trim($this->request['emo_set']); /* New emoticon set directory */ $this->request['new_emo_set'] = preg_replace('/[^a-zA-Z0-9\\-_]/', "", $this->request['new_emo_set']); /* Create the new set */ if ($this->request['new_emo_set']) { $emo_set_dir = trim($this->request['new_emo_set']); /* Check to see if the directory already exists */ if (file_exists(DOC_IPS_ROOT_PATH . PUBLIC_DIRECTORY . '/style_emoticons/' . $emo_set_dir)) { $this->registry->output->global_error = sprintf($this->lang->words['emo_already'], $emo_set_dir); return $this->emoticonsPackSplash(); } /* Create the directory */ if (@mkdir(DOC_IPS_ROOT_PATH . PUBLIC_DIRECTORY . '/style_emoticons/' . $emo_set_dir, IPS_FOLDER_PERMISSION)) { @chmod(DOC_IPS_ROOT_PATH . PUBLIC_DIRECTORY . '/style_emoticons/' . $emo_set_dir, IPS_FOLDER_PERMISSION); @file_put_contents(DOC_IPS_ROOT_PATH . PUBLIC_DIRECTORY . '/style_emoticons/' . $emo_set_dir . '/index.html', ''); } else { $this->registry->output->global_error = $this->lang->words['emo_ftp']; return $this->emoticonsPackSplash(); } } /* Get a list of current emoticons, if we are not overwriting */ $emo_image = array(); $emo_typed = array(); if ($this->request['overwrite'] != 1) { $this->DB->build(array('select' => '*', 'from' => 'emoticons', 'where' => "emo_set='" . $emo_set_dir . "'")); $this->DB->execute(); while ($r = $this->DB->fetch()) { $emo_image[$r['image']] = 1; $emo_typed[$r['typed']] = 1; } } /* Loop through the emoticons in the xml document */ foreach ($xml->fetchElements('emoticon') as $emoticon) { $entry = $xml->fetchElementsFromRecord($emoticon); /* Emoticon Data */ $image = $entry['image']; $typed = $entry['typed']; $click = $entry['clickable']; /* Skip if we're not overwriting */ if ($emo_image[$image] or $emo_typed[$typed]) { continue; } /* Get the extension */ $file_extension = preg_replace('#^.*\\.(.+?)$#si', "\\1", strtolower($image)); /* Make sure it's allowed */ if (!in_array($file_extension, $this->allowed_files)) { continue; } /* Remove any existing emoticon */ @unlink(DOC_IPS_ROOT_PATH . PUBLIC_DIRECTORY . '/style_emoticons/' . $emo_set_dir . '/' . $image); $this->DB->delete('emoticons', "typed='{$typed}' and image='{$image}' and emo_set='{$emo_set_dir}'"); /* Create the image in the file system */ if ($FH = fopen(DOC_IPS_ROOT_PATH . PUBLIC_DIRECTORY . '/style_emoticons/' . $emo_set_dir . '/' . $image, 'wb')) { if (fwrite($FH, $emoticons[$image])) { fclose($FH); /* Insert the emoticon record */ $this->DB->insert('emoticons', array('typed' => $typed, 'image' => $image, 'clickable' => $click, 'emo_set' => $emo_set_dir)); } } /* Add the emoticon to all the other directories */ try { foreach (new DirectoryIterator(DOC_IPS_ROOT_PATH . PUBLIC_DIRECTORY . '/style_emoticons/') as $file) { if (!$file->isDot() && $file->isDir()) { if (substr($file->getFilename(), 0, 1) == '.') { continue; } if (!is_file(DOC_IPS_ROOT_PATH . PUBLIC_DIRECTORY . '/style_emoticons/' . $file->getFilename() . '/' . $image)) { $this->DB->delete('emoticons', "typed='{$typed}' and image='{$image}' and emo_set='{$file->getFilename()}'"); if ($FH = @fopen(DOC_IPS_ROOT_PATH . PUBLIC_DIRECTORY . '/style_emoticons/' . $file->getFilename() . '/' . $image, 'wb')) { if (fwrite($FH, $emoticons[$image])) { fclose($FH); $this->DB->insert('emoticons', array('typed' => $typed, 'image' => $image, 'clickable' => $click, 'emo_set' => $file->getFilename())); } } } } } } catch (Exception $e) { } } /* Recache and bounce */ $this->emoticonsRebuildCache(); $this->registry->output->global_message = $this->lang->words['emo_xml_good']; $this->emoticonsOverview(); }
/** * Export all apps: Wrapper function really. Yes. It is. * * @access public * @return array Array of messages or errors */ public function exportAllApps() { $messages = array(); $errors = array(); foreach (ipsRegistry::$applications as $app_dir => $app_data) { @unlink(IPSLib::getAppDir($app_dir) . '/xml/' . $app_dir . '_settings.xml'); if (!file_exists(IPSLib::getAppDir($app_dir) . '/xml')) { $errors[] = "Error: " . IPSLib::getAppDir($app_dir) . "/xml/ does not exist"; continue; } else { if (!IPSLib::isWritable(IPSLib::getAppDir($app_dir) . '/xml')) { if (!@chmod(IPSLib::isWritable(IPSLib::getAppDir($app_dir) . '/xml', 0755))) { $errors[] = "Error: " . IPSLib::getAppDir($app_dir) . "/xml/ is not writeable"; continue; } } else { if (file_exists(IPSLib::getAppDir($app_dir) . '/xml/' . $app_dir . '_settings.xml') and !IPSLib::isWritable(IPSLib::getAppDir($app_dir) . '/xml/' . $app_dir . '_settings.xml')) { $errors[] = "Error: " . IPSLib::getAppDir($app_dir) . '/xml/' . $app_dir . "_settings.xml is not writeable"; continue; } } } $this->_exportXML($app_dir); $messages[] = $app_data['app_title'] . " Settings written into the application's XML directory"; /* In dev time stamp? */ if (IN_DEV) { $cache = $this->caches['indev']; $cache['import']['settings'][$app_dir] = time(); $this->cache->setCache('indev', $cache, array('donow' => 1, 'array' => 1)); } } return $errors ? $errors : $messages; }
/** * Write a PHP template cache file * * @access protected * @param int Skin set ID * @param string Group Name * @param string Template content * @return array Array of messages */ protected function _writePHPTemplate($setID, $groupName, $content) { //----------------------------------------- // INIT //----------------------------------------- $return = 0; $good_to_go = 0; if (!SAFE_MODE_ON) { $good_to_go = 1; if (IPSLib::isWritable(IPS_CACHE_PATH . 'cache/skin_cache/') === TRUE) { $good_to_go = 1; if (!is_dir(IPS_CACHE_PATH . 'cache/skin_cache/cacheid_' . $setID)) { if (!@mkdir(IPS_CACHE_PATH . 'cache/skin_cache/cacheid_' . $setID, IPS_FOLDER_PERMISSION)) { $this->_addErrorMessage(sprintf($this->lang->words['fatalnotemplatew'], $setID)); return; } else { @file_put_contents(IPS_CACHE_PATH . 'cache/skin_cache/cacheid_' . $setID . '/index.html', ''); @chmod(IPS_CACHE_PATH . 'cache/skin_cache/cacheid_' . $setID, IPS_FOLDER_PERMISSION); $good_to_go = 1; } } else { if (is_file(IPS_CACHE_PATH . 'cache/skin_cache/cacheid_' . $setID . '/' . $groupName . '.php')) { if (IPSLib::isWritable(IPS_CACHE_PATH . 'cache/skin_cache/cacheid_' . $setID . '/' . $groupName . '.php') !== TRUE) { $this->_addErrorMessage(sprintf($this->lang->words['templatefilenowrite'], $setID, $groupName)); $good_to_go = 0; } else { $good_to_go = 1; } } else { $good_to_go = 1; } } } else { $this->_addErrorMessage(sprintf($this->lang->words['fatalnotemplsafe'], IPS_CACHE_PATH)); } } //----------------------------------------- // Write... //----------------------------------------- if ($good_to_go) { if ($FH = @fopen(IPS_CACHE_PATH . 'cache/skin_cache/cacheid_' . $setID . '/' . $groupName . '.php', 'w')) { fwrite($FH, $content, strlen($content)); fclose($FH); @chmod(IPS_CACHE_PATH . 'cache/skin_cache/cacheid_' . $setID . '/' . $groupName . '.php', IPS_FILE_PERMISSION); $this->_addMessage($this->lang->words['basicwrittenpre'] . "skin_cache/cacheid_{$setID}/{$groupName}.php"); } else { $this->_addErrorMessage(sprintf($this->lang->words['templatefilenowrite'], $setID, $groupName)); } } }
/** * Export template XML into app dirs * * @access public * @param string App to export into * @param int [Set ID (0/root if omitted)] * @param bool Include root bits in any XML export. Default is true * @return void */ public function exportTemplateAppXML($app_dir, $setID = 0, $setOnly = TRUE) { //----------------------------------------- // Get it //----------------------------------------- $setData = $this->fetchSkinData($setID); $xml = $this->generateTemplateXML($app_dir, $setID, $setOnly); //----------------------------------------- // Attempt to write... //----------------------------------------- /* Set file name */ $file = IPSLib::getAppDir($app_dir) . '/xml/' . $app_dir . '_' . $setData['set_key'] . '_templates.xml'; /* Attempt to unlink first */ @unlink($file); if ($xml) { if (file_exists($file) and !IPSLib::isWritable($file)) { $this->_addErrorMessage($file . ' is not writeable'); return FALSE; } file_put_contents($file, $xml); $this->_addMessage("Templates for " . $app_dir . ' - ' . $setData['set_key'] . " created"); } else { //$this->_addMessage( "XML for " . $app_dir . ' - ' . $setData['set_key'] . " could not be generated" ); } }
/** * Write a PHP template cache file * * @access protected * @param int Skin set ID * @param string Group Name * @param string Template content * @return array Array of messages */ protected function _writePHPTemplate($setID, $groupName, $content) { //----------------------------------------- // INIT //----------------------------------------- $return = 0; $good_to_go = 0; if (!SAFE_MODE_ON) { $good_to_go = 1; if (IPSLib::isWritable(IPS_CACHE_PATH . 'cache/skin_cache/') === TRUE) { $good_to_go = 1; if (!is_dir(IPS_CACHE_PATH . 'cache/skin_cache/cacheid_' . $setID)) { if (!@mkdir(IPS_CACHE_PATH . 'cache/skin_cache/cacheid_' . $setID, 0777)) { $this->_addErrorMessage("Fatal! cannot create: cache/skin_cache/cacheid_{$setID}/"); return; } else { @file_put_contents(IPS_CACHE_PATH . 'cache/skin_cache/cacheid_' . $setID . '/index.html', ''); @chmod(IPS_CACHE_PATH . 'cache/skin_cache/cacheid_' . $setID, 0777); $good_to_go = 1; } } else { if (file_exists(IPS_CACHE_PATH . 'cache/skin_cache/cacheid_' . $setID . '/' . $groupName . '.php')) { if (IPSLib::isWritable(IPS_CACHE_PATH . 'cache/skin_cache/cacheid_' . $setID . '/' . $groupName . '.php') !== TRUE) { $this->_addErrorMessage("cache/skin_cache/cacheid_{$setID}/{$groupName}.php not writeable - cannot cache to PHP file"); $good_to_go = 0; } else { $good_to_go = 1; } } else { $good_to_go = 1; } } } else { $this->_addErrorMessage("Fatal! " . IPS_CACHE_PATH . "cache/skin_cache not writeable - please change permissions via FTP or turn on Safe Mode"); } } //----------------------------------------- // Write... //----------------------------------------- if ($good_to_go) { if ($FH = @fopen(IPS_CACHE_PATH . 'cache/skin_cache/cacheid_' . $setID . '/' . $groupName . '.php', 'w')) { fwrite($FH, $content, strlen($content)); fclose($FH); @chmod(IPS_CACHE_PATH . 'cache/skin_cache/cacheid_' . $setID . '/' . $groupName . '.php', 0777); $this->_addMessage("Wrote skin_cache/cacheid_{$setID}/{$groupName}.php"); } else { $this->_addErrorMessage("cache/skin_cache/cacheid_{$setID}/{$groupName}.php not writeable - cannot cache to PHP file"); } } }
/** * Export template XML into app dirs * * @access public * @param string App to export into * @param int [Set ID (0/root if omitted)] * @param bool Include root bits in any XML export. Default is true * @return @e void */ public function exportTemplateAppXML($app_dir, $setID = 0, $setOnly = TRUE) { //----------------------------------------- // Get it //----------------------------------------- $setData = $this->fetchSkinData($setID); $xml = $this->generateTemplateXML($app_dir, $setID, $setOnly); //----------------------------------------- // Attempt to write... //----------------------------------------- /* Set file name */ $file = IPSLib::getAppDir($app_dir) . '/xml/' . $app_dir . '_' . $setData['set_key'] . '_templates.xml'; /* Attempt to unlink first */ @unlink($file); if ($xml) { if (is_file($file) and !IPSLib::isWritable($file)) { $this->_addErrorMessage($file . ' ' . $this->lang->words['css_isnotwritable']); return FALSE; } file_put_contents($file, $xml); $this->_addMessage(sprintf($this->lang->words['templatescreatedmsg'], $app_dir, $setData['set_key'])); } }