Last active
April 2, 2019 22:13
-
-
Save tierra/0024360d130d26660fa5 to your computer and use it in GitHub Desktop.
phpBB 3.1 script that fetches all remote avatars, and converts them to uploaded avatars hosted locally.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
/** | |
* Converts all phpBB 3.1 remote avatars to uploaded avatars. | |
* | |
* To use this script: | |
* | |
* 1. Copy this file into the root of your phpBB installation. | |
* 2. Run the script from the command line: php convert-avatars.php | |
* | |
* Any avatar will be skipped if any errors come up, like these: | |
* - DNS Lookup Failed (domain gone) | |
* - Failed to connect to server | |
* - File not found (404) | |
* - Redirects to HTML pages (not images). | |
* - Invalid image size (these were valid for some forums in the past). | |
* | |
* If, after running this script, you'd just like to delete all of the | |
* remaining remote avatars (that were broken in some way listed above), | |
* you can run this SQL query: | |
* | |
* UPDATE phpbb_users SET user_avatar = '', user_avatar_type = '', | |
* user_avatar_width = 0, user_avatar_height = 0 | |
* WHERE user_avatar_type = 'avatar.driver.remote' | |
* | |
* @copyright (c) Bryan Petty | |
* @license GNU General Public License, version 2 (GPL-2.0) | |
*/ | |
if (php_sapi_name() != 'cli') | |
{ | |
echo 'This program must be run from the command line.' . PHP_EOL; | |
exit(1); | |
} | |
define('IN_PHPBB', true); | |
$phpbb_root_path = __DIR__ . '/'; | |
$phpEx = substr(strrchr(__FILE__, '.'), 1); | |
require($phpbb_root_path . 'includes/startup.' . $phpEx); | |
require($phpbb_root_path . 'phpbb/class_loader.' . $phpEx); | |
$phpbb_class_loader = new \phpbb\class_loader('phpbb\\', "{$phpbb_root_path}phpbb/", $phpEx); | |
$phpbb_class_loader->register(); | |
$phpbb_config_php_file = new \phpbb\config_php_file($phpbb_root_path, $phpEx); | |
extract($phpbb_config_php_file->get_all()); | |
require($phpbb_root_path . 'includes/constants.' . $phpEx); | |
require($phpbb_root_path . 'includes/functions.' . $phpEx); | |
require($phpbb_root_path . 'includes/functions_admin.' . $phpEx); | |
require($phpbb_root_path . 'includes/functions_upload.' . $phpEx); | |
require($phpbb_root_path . 'includes/utf/utf_tools.' . $phpEx); | |
$phpbb_container_builder = new \phpbb\di\container_builder($phpbb_config_php_file, $phpbb_root_path, $phpEx); | |
$phpbb_container_builder->set_dump_container(false); | |
$phpbb_container_builder->set_use_extensions(false); | |
$phpbb_container = $phpbb_container_builder->get_container(); | |
$phpbb_container->get('request')->enable_super_globals(); | |
require($phpbb_root_path . 'includes/compatibility_globals.' . $phpEx); | |
/** @var \phpbb\config\config $config */ | |
$config = $phpbb_container->get('config'); | |
/** @var \phpbb\db\driver\factory $db */ | |
$db = $phpbb_container->get('dbal.conn'); | |
/** @var \phpbb\path_helper $path_helper */ | |
$path_helper = $phpbb_container->get('path_helper'); | |
/** @var \phpbb\mimetype\guesser $mimetype_guesser */ | |
$mimetype_guesser = $phpbb_container->get('mimetype.guesser'); | |
$db->sql_query(" | |
SELECT `user_id`, `user_avatar` FROM " . USERS_TABLE . " | |
WHERE `user_avatar_type` = 'avatar.driver.remote' | |
"); | |
$remote_avatars = $db->sql_fetchrowset(); | |
foreach ($remote_avatars as $avatar) | |
{ | |
echo sprintf("ID: %7d URL: %s\n", $avatar['user_id'], $avatar['user_avatar']); | |
$upload = new \fileupload('AVATAR_', | |
array('gif', 'jpg', 'jpeg', 'png'), $config['avatar_filesize'], | |
$config['avatar_min_width'], $config['avatar_min_height'], | |
$config['avatar_max_width'], $config['avatar_max_height'], | |
(isset($config['mime_triggers']) ? explode('|', $config['mime_triggers']) : false) | |
); | |
/** @var \filespec $file */ | |
$file = $upload->remote_upload($avatar['user_avatar'], $mimetype_guesser); | |
$prefix = $config['avatar_salt'] . '_'; | |
$file->clean_filename('avatar', $prefix, $avatar['user_id']); | |
$destination = $config['avatar_path']; | |
// Adjust destination path (no trailing slash) | |
if (substr($destination, -1, 1) == '/' || substr($destination, -1, 1) == '\\') | |
{ | |
$destination = substr($destination, 0, -1); | |
} | |
$destination = str_replace(array('../', '..\\', './', '.\\'), '', $destination); | |
if ($destination && ($destination[0] == '/' || $destination[0] == "\\")) | |
{ | |
$destination = ''; | |
} | |
// Move file and overwrite any existing image | |
$file->move_file($destination, true); | |
if (!empty($file->error)) | |
{ | |
$file->remove(); | |
echo sprintf("Error (skipped): %s\n\n", $file->error[0]); | |
continue; | |
} | |
$update_data = array( | |
'user_avatar' => $avatar['user_id'] . '_' . time() . '.' . $file->get('extension'), | |
'user_avatar_type' => 'avatar.driver.upload', | |
'user_avatar_width' => $file->get('width'), | |
'user_avatar_height' => $file->get('height'), | |
); | |
$db->sql_query(" | |
UPDATE " . USERS_TABLE . " | |
SET " . $db->sql_build_array('UPDATE', $update_data) . " | |
WHERE `user_id` = " . (int) $avatar['user_id'] | |
); | |
if ($db->get_sql_error_triggered()) | |
{ | |
$file->remove(); | |
print_r($db->get_sql_error_returned()); | |
die(); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment