Please make sure IN_MYBB is defined.");
}
/**
* Allows us to refresh cache to prevent over flowing
*
* @param resource $fp
* @param string $contents
*/
function clear_overflow($fp, &$contents)
{
global $mybb;
if($mybb->input['method'] == 'disk')
{
if($mybb->input['filetype'] == 'gzip')
{
gzwrite($fp, $contents);
}
else
{
fwrite($fp, $contents);
}
}
else
{
if($mybb->input['filetype'] == "gzip")
{
echo gzencode($contents);
}
else
{
echo $contents;
}
}
$contents = '';
}
$page->add_breadcrumb_item($lang->database_backups, "index.php?module=tools-backupdb");
$plugins->run_hooks("admin_tools_backupdb_begin");
if($mybb->input['action'] == "dlbackup")
{
if(empty($mybb->input['file']))
{
flash_message($lang->error_file_not_specified, 'error');
admin_redirect("index.php?module=tools-backupdb");
}
$plugins->run_hooks("admin_tools_backupdb_dlbackup");
$file = basename($mybb->input['file']);
$ext = get_extension($file);
if(file_exists(MYBB_ADMIN_DIR.'backups/'.$file) && filetype(MYBB_ADMIN_DIR.'backups/'.$file) == 'file' && ($ext == 'gz' || $ext == 'sql'))
{
$plugins->run_hooks("admin_tools_backupdb_dlbackup_commit");
// Log admin action
log_admin_action($file);
header('Content-disposition: attachment; filename='.$file);
header("Content-type: ".$ext);
header("Content-length: ".filesize(MYBB_ADMIN_DIR.'backups/'.$file));
$handle = fopen(MYBB_ADMIN_DIR.'backups/'.$file, 'rb');
while(!feof($handle))
{
echo fread($handle, 8192);
}
fclose($handle);
}
else
{
flash_message($lang->error_invalid_backup, 'error');
admin_redirect("index.php?module=tools-backupdb");
}
}
if($mybb->input['action'] == "delete")
{
if($mybb->get_input('no'))
{
admin_redirect("index.php?module=tools-backupdb");
}
$file = basename($mybb->input['file']);
if(!trim($mybb->input['file']) || !file_exists(MYBB_ADMIN_DIR.'backups/'.$file))
{
flash_message($lang->error_backup_doesnt_exist, 'error');
admin_redirect("index.php?module=tools-backupdb");
}
$plugins->run_hooks("admin_tools_backupdb_delete");
if($mybb->request_method == "post")
{
$delete = @unlink(MYBB_ADMIN_DIR.'backups/'.$file);
if($delete)
{
$plugins->run_hooks("admin_tools_backupdb_delete_commit");
// Log admin action
log_admin_action($file);
flash_message($lang->success_backup_deleted, 'success');
admin_redirect("index.php?module=tools-backupdb");
}
else
{
flash_message($lang->error_backup_not_deleted, 'error');
admin_redirect("index.php?module=tools-backupdb");
}
}
else
{
$page->output_confirm_action("index.php?module=tools-backupdb&action=delete&file={$mybb->input['file']}", $lang->confirm_backup_deletion);
}
}
if($mybb->input['action'] == "backup")
{
$plugins->run_hooks("admin_tools_backupdb_backup");
if($mybb->request_method == "post")
{
if(empty($mybb->input['tables']) || !is_array($mybb->input['tables']))
{
flash_message($lang->error_tables_not_selected, 'error');
admin_redirect("index.php?module=tools-backupdb&action=backup");
}
@set_time_limit(0);
// create an array with table prefix appended for checks, as full table names are accepted
$binary_fields_prefixed = array();
foreach($mybb->binary_fields as $table => $fields)
{
$binary_fields_prefixed[TABLE_PREFIX.$table] = $fields;
}
if($mybb->input['method'] == 'disk')
{
$file = MYBB_ADMIN_DIR.'backups/backup_'.date("_Ymd_His_").random_str(16);
if($mybb->input['filetype'] == 'gzip')
{
if(!function_exists('gzopen')) // check zlib-ness
{
flash_message($lang->error_no_zlib, 'error');
admin_redirect("index.php?module=tools-backupdb&action=backup");
}
$fp = gzopen($file.'.incomplete.sql.gz', 'w9');
}
else
{
$fp = fopen($file.'.incomplete.sql', 'w');
}
}
else
{
$file = 'backup_'.substr(md5($mybb->user['uid'].TIME_NOW), 0, 10).random_str(54);
if($mybb->input['filetype'] == 'gzip')
{
if(!function_exists('gzopen')) // check zlib-ness
{
flash_message($lang->error_no_zlib, 'error');
admin_redirect("index.php?module=tools-backupdb&action=backup");
}
// Send headers for gzip file
header('Content-Type: application/x-gzip');
header('Content-Disposition: attachment; filename="'.$file.'.sql.gz"');
}
else
{
// Send standard headers for .sql
header('Content-Type: text/x-sql');
header('Content-Disposition: attachment; filename="'.$file.'.sql"');
}
}
$db->set_table_prefix('');
$time = date('dS F Y \a\t H:i', TIME_NOW);
$header = "-- MyBB Database Backup\n-- Generated: {$time}\n-- -------------------------------------\n\n";
$contents = $header;
foreach($mybb->input['tables'] as $table)
{
if(!$db->table_exists($db->escape_string($table)))
{
continue;
}
if($mybb->input['analyzeoptimize'] == 1)
{
$db->optimize_table($table);
$db->analyze_table($table);
}
$field_list = array();
$fields_array = $db->show_fields_from($table);
foreach($fields_array as $field)
{
$field_list[] = $field['Field'];
}
$fields = "`".implode("`,`", $field_list)."`";
if($mybb->input['contents'] != 'data')
{
$structure = $db->show_create_table($table).";\n";
$contents .= $structure;
if(isset($fp))
{
clear_overflow($fp, $contents);
}
}
if($mybb->input['contents'] != 'structure')
{
if($db->engine == 'mysqli')
{
$query = mysqli_query($db->read_link, "SELECT * FROM {$db->table_prefix}{$table}", MYSQLI_USE_RESULT);
}
else
{
$query = $db->simple_select($table);
}
while($row = $db->fetch_array($query))
{
$insert = "INSERT INTO {$table} ($fields) VALUES (";
$comma = '';
foreach($field_list as $field)
{
if(!isset($row[$field]) || is_null($row[$field]))
{
$insert .= $comma."NULL";
}
else
{
if($db->engine == 'mysqli')
{
if(!empty($binary_fields_prefixed[$table][$field]))
{
$insert .= $comma."X'".mysqli_real_escape_string($db->read_link, bin2hex($row[$field]))."'";
}
else
{
$insert .= $comma."'".mysqli_real_escape_string($db->read_link, $row[$field])."'";
}
}
else
{
if(!empty($binary_fields_prefixed[$table][$field]))
{
$insert .= $comma.$db->escape_binary($db->unescape_binary($row[$field]));
}
else
{
$insert .= $comma."'".$db->escape_string($row[$field])."'";
}
}
}
$comma = ',';
}
$insert .= ");\n";
$contents .= $insert;
if(isset($fp))
{
clear_overflow($fp, $contents);
}
}
$db->free_result($query);
}
}
$db->set_table_prefix(TABLE_PREFIX);
if($mybb->input['method'] == 'disk')
{
if($mybb->input['filetype'] == 'gzip')
{
gzwrite($fp, $contents);
gzclose($fp);
rename($file.'.incomplete.sql.gz', $file.'.sql.gz');
}
else
{
fwrite($fp, $contents);
fclose($fp);
rename($file.'.incomplete.sql', $file.'.sql');
}
if($mybb->input['filetype'] == 'gzip')
{
$ext = '.sql.gz';
}
else
{
$ext = '.sql';
}
$plugins->run_hooks("admin_tools_backupdb_backup_disk_commit");
// Log admin action
log_admin_action("disk", $file.$ext);
$file_from_admindir = 'index.php?module=tools-backupdb&action=dlbackup&file='.basename($file).$ext;
flash_message("{$lang->success_backup_created}{$lang->backup_saved_to}
{$file}{$ext} ({$lang->download})
", 'success');
admin_redirect("index.php?module=tools-backupdb");
}
else
{
$plugins->run_hooks("admin_tools_backupdb_backup_download_commit");
// Log admin action
log_admin_action("download");
if($mybb->input['filetype'] == 'gzip')
{
echo gzencode($contents);
}
else
{
echo $contents;
}
}
exit;
}
$page->extra_header = " \n";
$page->add_breadcrumb_item($lang->new_database_backup);
$page->output_header($lang->new_database_backup);
$sub_tabs['database_backup'] = array(
'title' => $lang->database_backups,
'link' => "index.php?module=tools-backupdb"
);
$sub_tabs['new_backup'] = array(
'title' => $lang->new_backup,
'link' => "index.php?module=tools-backupdb&action=backup",
'description' => $lang->new_backup_desc
);
$page->output_nav_tabs($sub_tabs, 'new_backup');
// Check if file is writable, before allowing submission
if(!is_writable(MYBB_ADMIN_DIR."/backups"))
{
$lang->update_button = '';
$page->output_alert($lang->alert_not_writable);
$cannot_write = true;
}
$table = new Table;
$table->construct_header($lang->table_selection);
$table->construct_header($lang->backup_options);
$table_selects = array();
$table_list = $db->list_tables($config['database']['database']);
foreach($table_list as $id => $table_name)
{
$table_selects[$table_name] = $table_name;
}
$form = new Form("index.php?module=tools-backupdb&action=backup", "post", "table_selection", 0, "table_selection");
$table->construct_cell("{$lang->table_select_desc}\n
\n{$lang->select_all}
\n{$lang->deselect_all}
\n{$lang->select_forum_tables}\n
\n".$form->generate_select_box("tables[]", $table_selects, false, array('multiple' => true, 'id' => 'table_select', 'size' => 20))."
", array('rowspan' => 5, 'width' => '50%', 'style' => 'border-bottom: 0px'));
$table->construct_row();
$table->construct_cell("{$lang->file_type}
\n{$lang->file_type_desc}
\n".$form->generate_radio_button("filetype", "gzip", $lang->gzip_compressed, array('checked' => 1))."
\n".$form->generate_radio_button("filetype", "plain", $lang->plain_text)."
", array('width' => '50%'));
$table->construct_row();
$table->construct_cell("{$lang->save_method}
\n{$lang->save_method_desc}
".$form->generate_radio_button("method", "disk", $lang->backup_directory)."
\n".$form->generate_radio_button("method", "download", $lang->download, array('checked' => 1))."
", array('width' => '50%'));
$table->construct_row();
$table->construct_cell("{$lang->backup_contents}
\n{$lang->backup_contents_desc}
".$form->generate_radio_button("contents", "both", $lang->structure_and_data, array('checked' => 1))."
\n".$form->generate_radio_button("contents", "structure", $lang->structure_only)."
\n".$form->generate_radio_button("contents", "data", $lang->data_only)."
", array('width' => '50%'));
$table->construct_row();
$table->construct_cell("{$lang->analyze_and_optimize}
\n{$lang->analyze_and_optimize_desc}
".$form->generate_yes_no_radio("analyzeoptimize")."
", array('width' => '50%'));
$table->construct_row();
$table->output($lang->new_database_backup);
$buttons[] = $form->generate_submit_button($lang->perform_backup);
$form->output_submit_wrapper($buttons);
$form->end();
$page->output_footer();
}
if(!$mybb->input['action'])
{
$page->add_breadcrumb_item($lang->backups);
$page->output_header($lang->database_backups);
$sub_tabs['database_backup'] = array(
'title' => $lang->database_backups,
'link' => "index.php?module=tools-backupdb",
'description' => $lang->database_backups_desc
);
$sub_tabs['new_backup'] = array(
'title' => $lang->new_backup,
'link' => "index.php?module=tools-backupdb&action=backup",
);
$plugins->run_hooks("admin_tools_backupdb_start");
$page->output_nav_tabs($sub_tabs, 'database_backup');
$backups = array();
$dir = MYBB_ADMIN_DIR.'backups/';
$handle = opendir($dir);
if($handle !== false)
{
while(($file = readdir($handle)) !== false)
{
if(filetype(MYBB_ADMIN_DIR.'backups/'.$file) == 'file')
{
$ext = get_extension($file);
if($ext == 'gz' || $ext == 'sql')
{
$backups[@filemtime(MYBB_ADMIN_DIR.'backups/'.$file)] = array(
"file" => $file,
"time" => @filemtime(MYBB_ADMIN_DIR.'backups/'.$file),
"type" => $ext
);
}
}
}
closedir($handle);
}
$count = count($backups);
krsort($backups);
$table = new Table;
$table->construct_header($lang->backup_filename);
$table->construct_header($lang->file_size, array("class" => "align_center"));
$table->construct_header($lang->creation_date);
$table->construct_header($lang->controls, array("class" => "align_center"));
foreach($backups as $backup)
{
$time = "-";
if($backup['time'])
{
$time = my_date('relative', $backup['time']);
}
$table->construct_cell("{$backup['file']}");
$table->construct_cell(get_friendly_size(filesize(MYBB_ADMIN_DIR.'backups/'.$backup['file'])), array("class" => "align_center"));
$table->construct_cell($time);
$table->construct_cell("post_code}\" onclick=\"return AdminCP.deleteConfirmation(this, '{$lang->confirm_backup_deletion}')\">{$lang->delete}", array("class" => "align_center"));
$table->construct_row();
}
if($count == 0)
{
$table->construct_cell($lang->no_backups, array('colspan' => 4));
$table->construct_row();
}
$table->output($lang->existing_database_backups);
$page->output_footer();
}