Please make sure IN_MYBB is defined.");
}
$page->add_breadcrumb_item($lang->preferences_and_personal_notes, "index.php?module=home-preferences");
$plugins->run_hooks("admin_home_preferences_begin");
if($mybb->input['action'] == "recovery_codes")
{
$page->add_breadcrumb_item($lang->recovery_codes, "index.php?module=home-preferences&action=recovery_codes");
// First: regenerate the codes
$codes = generate_recovery_codes();
$db->update_query("adminoptions", array("recovery_codes" => $db->escape_string(my_serialize($codes))), "uid='{$mybb->user['uid']}'");
// And now display them
$page->output_header($lang->recovery_codes);
$table = new Table;
$table->construct_header($lang->recovery_codes);
$table->construct_cell("{$lang->recovery_codes_warning} {$lang->print_recovery_codes}");
$table->construct_row();
$table->construct_cell(implode("
", $codes));
$table->construct_row();
$table->output($lang->recovery_codes);
$page->output_footer();
}
if(!$mybb->input['action'])
{
require_once MYBB_ROOT."inc/3rdparty/2fa/GoogleAuthenticator.php";
$auth = new PHPGangsta_GoogleAuthenticator;
$plugins->run_hooks("admin_home_preferences_start");
if($mybb->request_method == "post")
{
$query = $db->simple_select("adminoptions", "permissions, defaultviews, authsecret, recovery_codes", "uid='{$mybb->user['uid']}'");
$adminopts = $db->fetch_array($query);
$secret = $adminopts['authsecret'];
// Was the option changed? empty = disabled so ==
if($mybb->input['2fa'] == empty($secret))
{
// 2FA was enabled -> create secret and log
if($mybb->input['2fa'])
{
$secret = $auth->createSecret();
// We don't want to close this session now
$db->update_query("adminsessions", array("authenticated" => 1), "sid='".$db->escape_string($mybb->cookies['adminsid'])."'");
log_admin_action("enabled");
}
// 2FA was disabled -> clear secret
else
{
$secret = "";
$adminopts['recovery_codes'] = "";
log_admin_action("disabled");
}
}
$sqlarray = array(
"notes" => $db->escape_string($mybb->input['notes']),
"cpstyle" => $db->escape_string($mybb->input['cpstyle']),
"cplanguage" => $db->escape_string($mybb->input['cplanguage']),
"permissions" => $db->escape_string($adminopts['permissions']),
"defaultviews" => $db->escape_string($adminopts['defaultviews']),
"uid" => $mybb->user['uid'],
"codepress" => $mybb->get_input('codepress', MyBB::INPUT_INT), // It's actually CodeMirror but for compatibility purposes lets leave it codepress
"authsecret" => $db->escape_string($secret),
"recovery_codes" => $db->escape_string($adminopts['recovery_codes']),
);
$db->replace_query("adminoptions", $sqlarray, "uid");
$plugins->run_hooks("admin_home_preferences_start_commit");
flash_message($lang->success_preferences_updated, 'success');
admin_redirect("index.php?module=home-preferences");
}
$page->output_header($lang->preferences_and_personal_notes);
$sub_tabs['preferences'] = array(
'title' => $lang->preferences_and_personal_notes,
'link' => "index.php?module=home-preferences",
'description' => $lang->prefs_and_personal_notes_description
);
$page->output_nav_tabs($sub_tabs, 'preferences');
$query = $db->simple_select("adminoptions", "notes, cpstyle, cplanguage, codepress, authsecret", "uid='".$mybb->user['uid']."'", array('limit' => 1));
$admin_options = $db->fetch_array($query);
$form = new Form("index.php?module=home-preferences", "post");
$dir = @opendir(MYBB_ADMIN_DIR."/styles");
$folders = array();
while($folder = readdir($dir))
{
if($folder != "." && $folder != ".." && @file_exists(MYBB_ADMIN_DIR."/styles/$folder/main.css"))
{
$folders[$folder] = ucfirst($folder);
}
}
closedir($dir);
ksort($folders);
$styles = array_merge(array('' => $lang->use_default), $folders);
$setting_code = $form->generate_select_box("cpstyle", $styles, $admin_options['cpstyle']);
$languages = array_merge(array('' => $lang->use_default), $lang->get_languages(1));
$language_code = $form->generate_select_box("cplanguage", $languages, $admin_options['cplanguage']);
$form_container = new FormContainer($lang->preferences);
$form_container->output_row_header($lang->global_preferences);
$form_container->output_row($lang->acp_theme, $lang->select_acp_theme, $setting_code);
$form_container->output_row($lang->acp_language, $lang->select_acp_language, $language_code);
$form_container->output_row($lang->codemirror, $lang->use_codemirror_desc, $form->generate_on_off_radio('codepress', $admin_options['codepress']));
// If 2FA is enabled we need to display a link to the recovery codes page
if(!empty($admin_options['authsecret']))
{
$lang->use_2fa_desc .= "
".$lang->recovery_codes_desc." ".$lang->recovery_codes_warning;
}
$form_container->output_row($lang->my2fa, $lang->use_2fa_desc, $form->generate_on_off_radio('2fa', (int)!empty($admin_options['authsecret'])));
if(!empty($admin_options['authsecret']))
{
$qr = $auth->getQRCodeGoogleUrl($mybb->user['username']."@".str_replace(" ", "", $mybb->settings['bbname']), $admin_options['authsecret']);
$form_container->output_row($lang->my2fa_qr . "
end();
$table = new Table;
$table->construct_header($lang->notes_not_shared);
$table->construct_cell($form->generate_text_area("notes", $admin_options['notes'], array('style' => 'width: 99%; height: 300px;')));
$table->construct_row();
$table->output($lang->personal_notes);
$buttons[] = $form->generate_submit_button($lang->save_notes_and_prefs);
$form->output_submit_wrapper($buttons);
$form->end();
$page->output_footer();
}
/**
* Generate 10 random recovery codes, each with a length of 6 and without duplicates
*
* @return array
*/
function generate_recovery_codes()
{
$t = array();
while(count($t) < 10)
{
$g = random_str(6);
if(!in_array($g, $t))
{
$t[] = $g;
}
}
return $t;
}