2016-10-22 14:57:10 +00:00
< ? php
/* vim: set expandtab sw=4 ts=4 sts=4: */
/**
* User preferences management page
*
* @ package PhpMyAdmin
*/
/**
* Gets some core libraries and displays a top message if required
*/
require_once 'libraries/common.inc.php' ;
require_once 'libraries/user_preferences.lib.php' ;
require_once 'libraries/config/config_functions.lib.php' ;
require_once 'libraries/config/messages.inc.php' ;
2017-04-20 10:55:30 +00:00
require_once 'libraries/config/ConfigFile.class.php' ;
require_once 'libraries/config/Form.class.php' ;
require_once 'libraries/config/FormDisplay.class.php' ;
2016-10-22 14:57:10 +00:00
require 'libraries/config/user_preferences.forms.php' ;
2017-04-20 10:55:30 +00:00
PMA_userprefsPageInit ();
2016-10-22 14:57:10 +00:00
$error = '' ;
if ( isset ( $_POST [ 'submit_export' ])
2017-04-20 10:55:30 +00:00
&& filter_input ( INPUT_POST , 'export_type' ) == 'text_file'
2016-10-22 14:57:10 +00:00
) {
// export to JSON file
2017-04-20 10:55:30 +00:00
PMA_Response :: getInstance () -> disable ();
2016-10-22 14:57:10 +00:00
$filename = 'phpMyAdmin-config-' . urlencode ( PMA_getenv ( 'HTTP_HOST' )) . '.json' ;
PMA_downloadHeader ( $filename , 'application/json' );
$settings = PMA_loadUserprefs ();
2017-04-20 10:55:30 +00:00
echo json_encode ( $settings [ 'config_data' ]);
2016-10-22 14:57:10 +00:00
exit ;
} else if ( isset ( $_POST [ 'submit_get_json' ])) {
$settings = PMA_loadUserprefs ();
2017-04-20 10:55:30 +00:00
$response = PMA_Response :: getInstance ();
2016-10-22 14:57:10 +00:00
$response -> addJSON ( 'prefs' , json_encode ( $settings [ 'config_data' ]));
$response -> addJSON ( 'mtime' , $settings [ 'mtime' ]);
exit ;
} else if ( isset ( $_POST [ 'submit_import' ])) {
// load from JSON file
$json = '' ;
2017-04-20 10:55:30 +00:00
if ( filter_input ( INPUT_POST , 'import_type' ) == 'text_file'
2016-10-22 14:57:10 +00:00
&& isset ( $_FILES [ 'import_file' ])
&& $_FILES [ 'import_file' ][ 'error' ] == UPLOAD_ERR_OK
&& is_uploaded_file ( $_FILES [ 'import_file' ][ 'tmp_name' ])
) {
// read JSON from uploaded file
$open_basedir = @ ini_get ( 'open_basedir' );
$file_to_unlink = '' ;
$import_file = $_FILES [ 'import_file' ][ 'tmp_name' ];
// If we are on a server with open_basedir, we must move the file
// before opening it. The doc explains how to create the "./tmp"
// directory
if ( ! empty ( $open_basedir )) {
$tmp_subdir = ( PMA_IS_WINDOWS ? '.\\tmp\\' : 'tmp/' );
2017-04-20 10:55:30 +00:00
if ( is_writable ( $tmp_subdir )) {
2016-10-22 14:57:10 +00:00
$import_file_new = tempnam ( $tmp_subdir , 'prefs' );
if ( move_uploaded_file ( $import_file , $import_file_new )) {
$import_file = $import_file_new ;
$file_to_unlink = $import_file_new ;
}
}
}
$json = file_get_contents ( $import_file );
if ( $file_to_unlink ) {
unlink ( $file_to_unlink );
}
} else {
// read from POST value (json)
2017-04-20 10:55:30 +00:00
$json = filter_input ( INPUT_POST , 'json' );
2016-10-22 14:57:10 +00:00
}
// hide header message
$_SESSION [ 'userprefs_autoload' ] = true ;
$config = json_decode ( $json , true );
2017-04-20 10:55:30 +00:00
$return_url = filter_input ( INPUT_POST , 'return_url' );
2016-10-22 14:57:10 +00:00
if ( ! is_array ( $config )) {
$error = __ ( 'Could not import configuration' );
} else {
// sanitize input values: treat them as though
// they came from HTTP POST request
2017-04-20 10:55:30 +00:00
$form_display = new FormDisplay ();
2016-10-22 14:57:10 +00:00
foreach ( $forms as $formset_id => $formset ) {
foreach ( $formset as $form_name => $form ) {
$form_display -> registerForm ( $formset_id . ': ' . $form_name , $form );
}
}
2017-04-20 10:55:30 +00:00
$cf = ConfigFile :: getInstance ();
2016-10-22 14:57:10 +00:00
$new_config = $cf -> getFlatDefaultConfig ();
if ( ! empty ( $_POST [ 'import_merge' ])) {
$new_config = array_merge ( $new_config , $cf -> getConfigArray ());
}
$new_config = array_merge ( $new_config , $config );
$_POST_bak = $_POST ;
foreach ( $new_config as $k => $v ) {
$_POST [ str_replace ( '/' , '-' , $k )] = $v ;
}
$cf -> resetConfigData ();
$all_ok = $form_display -> process ( true , false );
$all_ok = $all_ok && ! $form_display -> hasErrors ();
$_POST = $_POST_bak ;
if ( ! $all_ok && isset ( $_POST [ 'fix_errors' ])) {
$form_display -> fixErrors ();
$all_ok = true ;
}
if ( ! $all_ok ) {
// mimic original form and post json in a hidden field
include 'libraries/user_preferences.inc.php' ;
2017-04-20 10:55:30 +00:00
$msg = PMA_Message :: error ( __ ( 'Configuration contains incorrect data for some fields.' ));
2016-10-22 14:57:10 +00:00
$msg -> display ();
echo '<div class="config-form">' ;
2017-04-20 10:55:30 +00:00
$form_display -> displayErrors ();
2016-10-22 14:57:10 +00:00
echo '</div>' ;
2017-04-20 10:55:30 +00:00
?>
< form action = " prefs_manage.php " method = " post " >
< ? php echo PMA_generate_common_hidden_inputs () . " \n " ; ?>
< input type = " hidden " name = " json " value = " <?php echo htmlspecialchars( $json ) ?> " />
< input type = " hidden " name = " fix_errors " value = " 1 " />
< ? php if ( ! empty ( $_POST [ 'import_merge' ])) { ?>
< input type = " hidden " name = " import_merge " value = " 1 " />
< ? php } ?>
< ? php if ( $return_url ) { ?>
< input type = " hidden " name = " return_url " value = " <?php echo htmlspecialchars( $return_url ) ?> " />
< ? php } ?>
< p >< ? php echo __ ( 'Do you want to import remaining settings?' ) ?> </p>
< input type = " submit " name = " submit_import " value = " <?php echo __('Yes') ?> " />
< input type = " submit " name = " submit_ignore " value = " <?php echo __('No') ?> " />
</ form >
< ? php
2016-10-22 14:57:10 +00:00
exit ;
}
// check for ThemeDefault and fontsize
$params = array ();
if ( isset ( $config [ 'ThemeDefault' ])
&& $_SESSION [ 'PMA_Theme_Manager' ] -> theme -> getId () != $config [ 'ThemeDefault' ]
&& $_SESSION [ 'PMA_Theme_Manager' ] -> checkTheme ( $config [ 'ThemeDefault' ])
) {
$_SESSION [ 'PMA_Theme_Manager' ] -> setActiveTheme ( $config [ 'ThemeDefault' ]);
$_SESSION [ 'PMA_Theme_Manager' ] -> setThemeCookie ();
}
if ( isset ( $config [ 'fontsize' ])
&& $config [ 'fontsize' ] != $GLOBALS [ 'PMA_Config' ] -> get ( 'fontsize' )
) {
$params [ 'set_fontsize' ] = $config [ 'fontsize' ];
}
if ( isset ( $config [ 'lang' ])
&& $config [ 'lang' ] != $GLOBALS [ 'lang' ]
) {
$params [ 'lang' ] = $config [ 'lang' ];
}
if ( isset ( $config [ 'collation_connection' ])
&& $config [ 'collation_connection' ] != $GLOBALS [ 'collation_connection' ]
) {
$params [ 'collation_connection' ] = $config [ 'collation_connection' ];
}
// save settings
$result = PMA_saveUserprefs ( $cf -> getConfigArray ());
if ( $result === true ) {
if ( $return_url ) {
2017-04-20 10:55:30 +00:00
$query = PMA_Util :: splitURLQuery ( $return_url );
2016-10-22 14:57:10 +00:00
$return_url = parse_url ( $return_url , PHP_URL_PATH );
foreach ( $query as $q ) {
2017-04-20 10:55:30 +00:00
$pos = strpos ( $q , '=' );
$k = substr ( $q , 0 , $pos );
2016-10-22 14:57:10 +00:00
if ( $k == 'token' ) {
continue ;
}
2017-04-20 10:55:30 +00:00
$params [ $k ] = substr ( $q , $pos + 1 );
2016-10-22 14:57:10 +00:00
}
} else {
$return_url = 'prefs_manage.php' ;
}
// reload config
$GLOBALS [ 'PMA_Config' ] -> loadUserPreferences ();
PMA_userprefsRedirect ( $return_url , $params );
exit ;
} else {
$error = $result ;
}
}
} else if ( isset ( $_POST [ 'submit_clear' ])) {
$result = PMA_saveUserprefs ( array ());
if ( $result === true ) {
$params = array ();
2017-04-20 10:55:30 +00:00
if ( $_SESSION [ 'PMA_Theme_Manager' ] -> theme -> getId () != 'original' ) {
$GLOBALS [ 'PMA_Config' ] -> removeCookie (
$_SESSION [ 'PMA_Theme_Manager' ] -> getThemeCookieName ()
);
unset ( $_SESSION [ 'PMA_Theme_Manager' ]);
unset ( $_SESSION [ 'PMA_Theme' ]);
}
2016-10-22 14:57:10 +00:00
if ( $GLOBALS [ 'PMA_Config' ] -> get ( 'fontsize' ) != '82%' ) {
$GLOBALS [ 'PMA_Config' ] -> removeCookie ( 'pma_fontsize' );
}
$GLOBALS [ 'PMA_Config' ] -> removeCookie ( 'pma_collaction_connection' );
$GLOBALS [ 'PMA_Config' ] -> removeCookie ( 'pma_lang' );
PMA_userprefsRedirect ( 'prefs_manage.php' , $params );
exit ;
} else {
$error = $result ;
}
exit ;
}
2017-04-20 10:55:30 +00:00
$response = PMA_Response :: getInstance ();
2016-10-22 14:57:10 +00:00
$header = $response -> getHeader ();
$scripts = $header -> getScripts ();
$scripts -> addFile ( 'config.js' );
require 'libraries/user_preferences.inc.php' ;
if ( $error ) {
2017-04-20 10:55:30 +00:00
if ( ! $error instanceof PMA_Message ) {
$error = PMA_Message :: error ( $error );
2016-10-22 14:57:10 +00:00
}
$error -> display ();
}
?>
< script type = " text/javascript " >
< ? php
PMA_printJsValue ( " PMA_messages['strSavedOn'] " , __ ( 'Saved on: @DATE@' ));
?>
</ script >
< div id = " maincontainer " >
< div id = " main_pane_left " >
< div class = " group " >
2017-04-20 10:55:30 +00:00
< h2 >< ? php echo __ ( 'Import' ) ?> </h2>
< form class = " group-cnt prefs-form disableAjax " name = " prefs_import " action = " prefs_manage.php " method = " post " enctype = " multipart/form-data " >
< ? php
echo PMA_Util :: generateHiddenMaxFileSize ( $max_upload_size ) . " \n " ;
echo PMA_generate_common_hidden_inputs () . " \n " ;
?>
< input type = " hidden " name = " json " value = " " />
< input type = " radio " id = " import_text_file " name = " import_type " value = " text_file " checked = " checked " />
< label for = " import_text_file " >< ? php echo __ ( 'Import from file' ) ?> </label>
< div id = " opts_import_text_file " class = " prefsmanage_opts " >
< label for = " input_import_file " >< ? php echo __ ( 'Browse your computer:' ); ?> </label>
< input type = " file " name = " import_file " id = " input_import_file " />
</ div >
< input type = " radio " id = " import_local_storage " name = " import_type " value = " local_storage " disabled = " disabled " />
< label for = " import_local_storage " >< ? php echo __ ( 'Import from browser\'s storage' ) ?> </label>
< div id = " opts_import_local_storage " class = " prefsmanage_opts disabled " >
< div class = " localStorage-supported " >
< ? php echo __ ( 'Settings will be imported from your browser\'s local storage.' ) ?>
< br />
< div class = " localStorage-exists " >
< ? php echo __ ( 'Saved on: @DATE@' ) ?>
</ div >
< div class = " localStorage-empty " >
< ? php PMA_Message :: notice ( __ ( 'You have no saved settings!' )) -> display () ?>
</ div >
</ div >
< div class = " localStorage-unsupported " >
< ? php PMA_Message :: notice ( __ ( 'This feature is not supported by your web browser' )) -> display () ?>
</ div >
</ div >
< input type = " checkbox " id = " import_merge " name = " import_merge " />
< label for = " import_merge " >< ? php echo __ ( 'Merge with current configuration' ) ?> </label>
< br />< br />
< input type = " submit " name = " submit_import " value = " <?php echo __('Go'); ?> " />
</ form >
</ div >
< ? php
if ( file_exists ( 'setup/index.php' )) {
2016-10-22 14:57:10 +00:00
// show only if setup script is available, allows to disable this message
// by simply removing setup directory
2017-04-20 10:55:30 +00:00
?>
< div class = " group " >
2016-10-22 14:57:10 +00:00
< h2 >< ? php echo __ ( 'More settings' ) ?> </h2>
< div class = " group-cnt " >
< ? php
2017-04-20 10:55:30 +00:00
echo sprintf ( __ ( 'You can set more settings by modifying config.inc.php, eg. by using %sSetup script%s.' ), '<a href="setup/index.php" target="_blank">' , '</a>' );
echo PMA_Util :: showDocu ( 'setup' , 'setup-script' );
2016-10-22 14:57:10 +00:00
?>
</ div >
2017-04-20 10:55:30 +00:00
</ div >
2016-10-22 14:57:10 +00:00
< ? php
2017-04-20 10:55:30 +00:00
}
2016-10-22 14:57:10 +00:00
?>
</ div >
< div id = " main_pane_right " >
< div class = " group " >
2017-04-20 10:55:30 +00:00
< h2 >< ? php echo __ ( 'Export' ) ?> </h2>
2016-10-22 14:57:10 +00:00
< div class = " click-hide-message group-cnt " style = " display:none " >
< ? php
2017-04-20 10:55:30 +00:00
PMA_Message :: rawSuccess ( __ ( 'Configuration has been saved' )) -> display ();
2016-10-22 14:57:10 +00:00
?>
</ div >
2017-04-20 10:55:30 +00:00
< form class = " group-cnt prefs-form disableAjax " name = " prefs_export " action = " prefs_manage.php " method = " post " >
< ? php echo PMA_generate_common_hidden_inputs () . " \n " ?>
2016-10-22 14:57:10 +00:00
< div style = " padding-bottom:0.5em " >
2017-04-20 10:55:30 +00:00
< input type = " radio " id = " export_text_file " name = " export_type " value = " text_file " checked = " checked " />
< label for = " export_text_file " >< ? php echo __ ( 'Save as file' ) ?> </label>
< br />
< input type = " radio " id = " export_local_storage " name = " export_type " value = " local_storage " disabled = " disabled " />
< label for = " export_local_storage " >< ? php echo __ ( 'Save to browser\'s storage' ) ?> </label>
2016-10-22 14:57:10 +00:00
</ div >
2017-04-20 10:55:30 +00:00
< div id = " opts_export_local_storage " class = " prefsmanage_opts disabled " >
2016-10-22 14:57:10 +00:00
< span class = " localStorage-supported " >
2017-04-20 10:55:30 +00:00
< ? php echo __ ( 'Settings will be saved in your browser\'s local storage.' ) ?>
< span class = " localStorage-exists " >
< br />< b >< ? php echo __ ( 'Existing settings will be overwritten!' ) ?> </b>
</ span >
2016-10-22 14:57:10 +00:00
</ span >
< div class = " localStorage-unsupported " >
2017-04-20 10:55:30 +00:00
< ? php PMA_Message :: notice ( __ ( 'This feature is not supported by your web browser' )) -> display () ?>
2016-10-22 14:57:10 +00:00
</ div >
</ div >
< br />
2017-04-20 10:55:30 +00:00
< input type = " submit " name = " submit_export " value = " <?php echo __('Go'); ?> " />
2016-10-22 14:57:10 +00:00
</ form >
</ div >
< div class = " group " >
2017-04-20 10:55:30 +00:00
< h2 >< ? php echo __ ( 'Reset' ) ?> </h2>
< form class = " group-cnt prefs-form disableAjax " name = " prefs_reset " action = " prefs_manage.php " method = " post " >
< ? php echo PMA_generate_common_hidden_inputs () . " \n " ?>
< ? php echo __ ( 'You can reset all your settings and restore them to default values.' ) ?>
2016-10-22 14:57:10 +00:00
< br />< br />
2017-04-20 10:55:30 +00:00
< input type = " submit " name = " submit_clear " value = " <?php echo __('Reset') ?> " />
2016-10-22 14:57:10 +00:00
</ form >
2017-04-20 10:55:30 +00:00
2016-10-22 14:57:10 +00:00
</ div >
</ div >
< br class = " clearfloat " />
</ div >