Exemplo n.º 1
0
function getPackageInfo($gzfilename)
{
    global $boarddir;
    // Extract package-info.xml from downloaded file. (*/ is used because it could be in any directory.)
    if (strpos($gzfilename, 'http://') !== false) {
        $packageInfo = read_tgz_data(fetch_web_data($gzfilename, '', true), '*/package-info.xml', true);
    } else {
        if (!file_exists($boarddir . '/Packages/' . $gzfilename)) {
            return 'package_get_error_not_found';
        }
        if (is_file($boarddir . '/Packages/' . $gzfilename)) {
            $packageInfo = read_tgz_file($boarddir . '/Packages/' . $gzfilename, '*/package-info.xml', true);
        } elseif (file_exists($boarddir . '/Packages/' . $gzfilename . '/package-info.xml')) {
            $packageInfo = file_get_contents($boarddir . '/Packages/' . $gzfilename . '/package-info.xml');
        } else {
            return 'package_get_error_missing_xml';
        }
    }
    // Nothing?
    if (empty($packageInfo)) {
        return 'package_get_error_is_zero';
    }
    // Parse package-info.xml into an xmlArray.
    loadClassFile('Class-Package.php');
    $packageInfo = new xmlArray($packageInfo);
    // !!! Error message of some sort?
    if (!$packageInfo->exists('package-info[0]')) {
        return 'package_get_error_packageinfo_corrupt';
    }
    $packageInfo = $packageInfo->path('package-info[0]');
    $package = $packageInfo->to_array();
    $package['xml'] = $packageInfo;
    $package['filename'] = $gzfilename;
    if (!isset($package['type'])) {
        $package['type'] = 'modification';
    }
    return $package;
}
Exemplo n.º 2
0
function gameCacheInsertGames($games, $return = false)
{
    global $scripturl, $txt, $db_prefix, $modSettings, $context, $sourcedir, $smcFunc, $boarddir;
    $filesAvailable = array();
    $filesKeys = array();
    foreach ($games as $id => $game) {
        if ($game['type'] == 'game') {
            if (!empty($game['directory'])) {
                $game_directory = $modSettings['gamesDirectory'] . '/' . $game['directory'];
                $game_file = $modSettings['gamesDirectory'] . '/' . $game['directory'] . '/' . $game['filename'];
            } else {
                $game_directory = $modSettings['gamesDirectory'];
                $game_file = $modSettings['gamesDirectory'] . '/' . $game['filename'];
            }
            $filesAvailable[$game_file] = $id;
            $filesKeys[$game_file] = $id;
            // Move gamedata file for IBP arcade games
            if (file_exists($game_directory . '/gamedata')) {
                $from = $game_directory . '/gamedata';
                $to = $boarddir . '/arcade/gamedata';
                if (!file_exists($boarddir . '/arcade/')) {
                    if (!mkdir($boarddir . '/arcade/', 0755)) {
                        fatal_lang_error('unable_to_make', false, array($boarddir . '/arcade/'));
                    }
                }
                if (!file_exists($to)) {
                    if (!mkdir($to, 0755)) {
                        fatal_lang_error('unable_to_make', false, array($to));
                    }
                } elseif (!is_dir($to)) {
                    fatal_lang_error('unable_to_make', false, array($to));
                }
                if (!is_writable($to)) {
                    fatal_lang_error('unable_to_chmod', false, array($to));
                }
                /*  Changed rename to copy  */
                $dir = opendir($from);
                $success = true;
                while ($fileFrom = readdir($dir)) {
                    if ($fileFrom == '.' || $fileFrom == '..') {
                        continue;
                    }
                    copy_arcade_directory($from, $to);
                    deleteArcadeArchives($from);
                    /* $success &= rename($from . '/' . $fileFrom, $to . '/' . $fileFrom); */
                }
                closedir($dir);
                if (!file_exists($to)) {
                    fatal_lang_error('unable_to_move', false, array($from, $to));
                }
                /* if (!$success)
                			fatal_lang_error('unable_to_move', false, array($from, $to)); */
            }
        }
    }
    // Installed games
    $request = $smcFunc['db_query']('', '
		SELECT id_game, game_name, internal_name, game_file, game_directory
		FROM {db_prefix}arcade_games');
    while ($row = $smcFunc['db_fetch_assoc']($request)) {
        if (!empty($row['game_directory'])) {
            $game_file = $modSettings['gamesDirectory'] . '/' . $row['game_directory'] . '/' . $row['game_file'];
        } else {
            $game_file = $modSettings['gamesDirectory'] . '/' . $row['game_file'];
        }
        if (isset($filesKeys[$game_file])) {
            $games[$filesKeys[$game_file]] += array('type' => 'game', 'id' => $row['id_game'], 'name' => $row['game_name'], 'directory' => $row['game_directory'], 'filename' => $row['game_file'], 'internal_name' => $row['internal_name'], 'installed' => true);
        } else {
            $fileKeys[$game_file] = count($games);
            $games[] = array('type' => 'game', 'id' => $row['id_game'], 'name' => $row['game_name'], 'directory' => $row['game_directory'], 'filename' => $row['game_file'], 'internal_name' => $row['internal_name'], 'missing_files' => true);
        }
    }
    $smcFunc['db_free_result']($request);
    $rows = array();
    // Last step
    foreach ($games as $id => $game) {
        if (!empty($game['directory'])) {
            $game_directory = $modSettings['gamesDirectory'] . '/' . $game['directory'];
            $game_file = $modSettings['gamesDirectory'] . '/' . $game['directory'] . '/' . $game['filename'];
        } else {
            $game_directory = $modSettings['gamesDirectory'];
            $game_file = $modSettings['gamesDirectory'] . '/' . $game['filename'];
        }
        // Regular game?
        if ($game['type'] == 'game') {
            // Use game info if possible
            if (file_exists($game_directory . '/game-info.xml') && !isset($game['gameinfo'])) {
                $gameinfo = readGameInfo($game_directory . '/game-info.xml');
            }
        } elseif ($game['type'] == 'gamepackage') {
            $gameinfo = read_tgz_data(file_get_contents($game_file), 'game-info.xml', true);
            $gameinfo = new xmlArray($gameinfo);
            $gameinfo = $gameinfo->path('game-info[0]');
            $gameinfo = $gameinfo->to_array();
        } elseif ($game['type'] == 'gamepackage-multi') {
            $game['name'] = 'GamePack ' . substr($game['filename'], 0, strrpos($game['filename'], '.'));
        }
        if (isset($gameinfo) && !isset($game['name'])) {
            $game['name'] = $gameinfo['name'];
        } elseif (!isset($game['name'])) {
            $game['name'] = getGameName(getInternalName($game['filename'], $game_directory));
        }
        // Status of game
        $status = 10;
        if (!empty($game['missing_files'])) {
            $status = 2;
        } elseif (!empty($game['installed'])) {
            $status = 1;
        }
        if (!isset($game['id'])) {
            $game['id'] = 0;
        }
        if (!isset($game['directory'])) {
            $game['directory'] = '';
        }
        if (!isset($game['filename'])) {
            $game['filename'] = '';
        }
        // Escape data to be inserted into database
        $rows[] = array($game['id'], $game['type'], $game['name'], $status, $game['filename'], $game['directory']);
        unset($gameinfo);
    }
    if (!empty($rows)) {
        $smcFunc['db_insert']('insert', '{db_prefix}arcade_files', array('id_game' => 'int', 'file_type' => 'string-30', 'game_name' => 'string-255', 'status' => 'int', 'game_file' => 'string-255', 'game_directory' => 'string-255'), $rows, array('internal_name'));
    }
    if ($return) {
        return $rows;
    }
}
Exemplo n.º 3
0
/**
 * Loads a package's information and returns a representative array.
 *
 * - Expects the file to be a package in packages/.
 * - Returns a error string if the package-info is invalid.
 * - Otherwise returns a basic array of id, version, filename, and similar information.
 * - An Xml_Array is available in 'xml'.
 *
 * @package Packages
 * @param string $gzfilename
 */
function getPackageInfo($gzfilename)
{
    $gzfilename = trim($gzfilename);
    // Extract package-info.xml from downloaded file. (*/ is used because it could be in any directory.)
    if (preg_match('~^https?://~i', $gzfilename) === 1) {
        $packageInfo = read_tgz_data(fetch_web_data($gzfilename, '', true), '*/package-info.xml', true);
    } else {
        // It must be in the package directory then
        if (!file_exists(BOARDDIR . '/packages/' . $gzfilename)) {
            return 'package_get_error_not_found';
        }
        // Make sure an package.xml file is available
        if (is_file(BOARDDIR . '/packages/' . $gzfilename)) {
            $packageInfo = read_tgz_file(BOARDDIR . '/packages/' . $gzfilename, '*/package-info.xml', true);
        } elseif (file_exists(BOARDDIR . '/packages/' . $gzfilename . '/package-info.xml')) {
            $packageInfo = file_get_contents(BOARDDIR . '/packages/' . $gzfilename . '/package-info.xml');
        } else {
            return 'package_get_error_missing_xml';
        }
    }
    // Nothing?
    if (empty($packageInfo)) {
        // Perhaps they are trying to install a theme, lets tell them nicely this is the wrong function
        $packageInfo = read_tgz_file(BOARDDIR . '/packages/' . $gzfilename, '*/theme_info.xml', true);
        if (!empty($packageInfo)) {
            return 'package_get_error_is_theme';
        } else {
            return 'package_get_error_is_zero';
        }
    }
    // Parse package-info.xml into an Xml_Array.
    require_once SUBSDIR . '/XmlArray.class.php';
    $packageInfo = new Xml_Array($packageInfo);
    // @todo Error message of some sort?
    if (!$packageInfo->exists('package-info[0]')) {
        return 'package_get_error_packageinfo_corrupt';
    }
    $packageInfo = $packageInfo->path('package-info[0]');
    // Convert packageInfo to an array for use
    $package = htmlspecialchars__recursive($packageInfo->to_array());
    $package['xml'] = $packageInfo;
    $package['filename'] = $gzfilename;
    // Set a default type if none was supplied in the package
    if (!isset($package['type'])) {
        $package['type'] = 'modification';
    }
    return $package;
}
Exemplo n.º 4
0
/**
 * Loads a package's information and returns a representative array.
 * - expects the file to be a package in Packages/.
 * - returns a error string if the package-info is invalid.
 * - otherwise returns a basic array of id, version, filename, and similar information.
 * - an xmlArray is available in 'xml'.
 *
 * @param string $filename
 * @return array
 */
function getPackageInfo($gzfilename)
{
    global $boarddir, $sourcedir, $smcFunc;
    // Extract package-info.xml from downloaded file. (*/ is used because it could be in any directory.)
    if (strpos($gzfilename, 'http://') !== false) {
        $packageInfo = read_tgz_data(fetch_web_data($gzfilename, '', true), '*/package-info.xml', true);
    } else {
        if (!file_exists($boarddir . '/Packages/' . $gzfilename)) {
            return 'package_get_error_not_found';
        }
        if (is_file($boarddir . '/Packages/' . $gzfilename)) {
            $packageInfo = read_tgz_file($boarddir . '/Packages/' . $gzfilename, '*/package-info.xml', true);
        } elseif (file_exists($boarddir . '/Packages/' . $gzfilename . '/package-info.xml')) {
            $packageInfo = file_get_contents($boarddir . '/Packages/' . $gzfilename . '/package-info.xml');
        } else {
            return 'package_get_error_missing_xml';
        }
    }
    // Nothing?
    if (empty($packageInfo)) {
        // Perhaps they are trying to install a theme, lets tell them nicely this is the wrong function
        $packageInfo = read_tgz_file($boarddir . '/Packages/' . $gzfilename, '*/theme_info.xml', true);
        if (!empty($packageInfo)) {
            return 'package_get_error_is_theme';
        } else {
            return 'package_get_error_is_zero';
        }
    }
    // Parse package-info.xml into an xmlArray.
    require_once $sourcedir . '/Class-Package.php';
    $packageInfo = new xmlArray($packageInfo);
    // @todo Error message of some sort?
    if (!$packageInfo->exists('package-info[0]')) {
        return 'package_get_error_packageinfo_corrupt';
    }
    $packageInfo = $packageInfo->path('package-info[0]');
    $package = $packageInfo->to_array();
    $package['xml'] = $packageInfo;
    $package['filename'] = $gzfilename;
    $package['name'] = $smcFunc['htmlspecialchars']($package['name']);
    if (!isset($package['type'])) {
        $package['type'] = 'modification';
    }
    return $package;
}