<?php namespace WPDataAccess\Utilities; use WPDataAccess\API\WPDA_Tree; use WPDataAccess\Connection\WPDADB; use WPDataAccess\Data_Dictionary\WPDA_Dictionary_Access; use WPDataAccess\WPDA; class WPDA_Remote_Database { private $page = null; private $user_can_create_db = false; private $rdb = array(); public function __construct() { wp_enqueue_style( 'wp-jquery-ui-core' ); wp_enqueue_style( 'wp-jquery-ui-dialog' ); wp_enqueue_style( 'wp-jquery-ui-sortable' ); wp_enqueue_style( 'wp-jquery-ui-tabs' ); wp_enqueue_script( 'jquery-ui-core' ); wp_enqueue_script( 'jquery-ui-dialog' ); wp_enqueue_script( 'jquery-ui-tabs' ); wp_enqueue_script( 'jquery-ui-sortable' ); wp_enqueue_script( 'jquery-ui-tooltip' ); wp_enqueue_script( 'jquery-ui-autocomplete' ); if ( isset( $_REQUEST['page'] ) ) { $this->page = sanitize_text_field( wp_unslash( $_REQUEST['page'] ) ); // input var okay. } $this->user_can_create_db = WPDA_Dictionary_Access::can_create_db(); if ( current_user_can( 'manage_options' ) ) { if ( isset( $_REQUEST['action'] ) ) { // Process create, drop and alter database actions. if ( 'create_db' === $_REQUEST['action'] ) { $this->create_db(); } elseif ( 'drop_db' === $_REQUEST['action'] ) { $this->drop_db(); } elseif ( 'edit_db' === $_REQUEST['action'] ) { $this->edit_db(); } } } } private function create_db() { if ( !$this->check_wpnonce( 'wpda-create-db-from-data-explorer-' . WPDA::get_current_user_login(), '_wpnoncecreatedb' ) ) { return; } if ( isset( $_REQUEST['database_location'] ) && 'local' === $_REQUEST['database_location'] ) { // Add local database if ( !isset( $_REQUEST['local_database'] ) ) { $msg = new WPDA_Message_Box(array( 'message_text' => sprintf( __( 'Cannot create database [missing argument]', 'wp-data-access' ) ), 'message_type' => 'error', 'message_is_dismissible' => false, )); $msg->box(); return; } $database = str_replace( '`', '', sanitize_text_field( wp_unslash( $_REQUEST['local_database'] ) ) ); // input var okay. global $wpdb; if ( false === $wpdb->query( $wpdb->prepare( 'create database `%1s`', // phpcs:ignore WordPress.DB.PreparedSQLPlaceholders array(WPDA::remove_backticks( $database )) ) ) ) { // db call ok; no-cache ok. $msg = new WPDA_Message_Box(array( 'message_text' => sprintf( __( 'Error creating database `%s`', 'wp-data-access' ), $database ), 'message_type' => 'error', 'message_is_dismissible' => false, )); $msg->box(); } else { $msg = new WPDA_Message_Box(array( 'message_text' => sprintf( __( 'Database `%s` created', 'wp-data-access' ), $database ), )); $msg->box(); $this->switch_schema_name = $database; } } else { // Add remote database $database = ( isset( $_REQUEST['remote_database'] ) ? sanitize_text_field( wp_unslash( $_REQUEST['remote_database'] ) ) : '' ); // input var okay. if ( false !== WPDADB::get_remote_database( $database ) ) { $msg = new WPDA_Message_Box(array( 'message_text' => sprintf( __( 'Remote database connection already exists', 'wp-data-access' ) ), 'message_type' => 'error', 'message_is_dismissible' => false, )); $msg->box(); return; } $host = ( isset( $_REQUEST['remote_host'] ) ? sanitize_text_field( wp_unslash( $_REQUEST['remote_host'] ) ) : '' ); // input var okay. $user = ( isset( $_REQUEST['remote_user'] ) ? sanitize_text_field( wp_unslash( $_REQUEST['remote_user'] ) ) : '' ); // input var okay. $passwd = ( isset( $_REQUEST['remote_passwd'] ) ? wp_unslash( $_REQUEST['remote_passwd'] ) : '' ); // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized $port = ( isset( $_REQUEST['remote_port'] ) ? sanitize_text_field( wp_unslash( $_REQUEST['remote_port'] ) ) : '' ); // input var okay. $schema = ( isset( $_REQUEST['remote_schema'] ) ? sanitize_text_field( wp_unslash( $_REQUEST['remote_schema'] ) ) : '' ); // input var okay. $ssl = ( isset( $_REQUEST['remote_ssl'] ) ? sanitize_text_field( wp_unslash( $_REQUEST['remote_ssl'] ) ) : 'off' ); // input var okay. $ssl_key = ( isset( $_REQUEST['remote_client_key'] ) ? sanitize_text_field( wp_unslash( $_REQUEST['remote_client_key'] ) ) : '' ); // input var okay. $ssl_cert = ( isset( $_REQUEST['remote_client_certificate'] ) ? sanitize_text_field( wp_unslash( $_REQUEST['remote_client_certificate'] ) ) : '' ); // input var okay. $ssl_ca = ( isset( $_REQUEST['remote_ca_certificate'] ) ? sanitize_text_field( wp_unslash( $_REQUEST['remote_ca_certificate'] ) ) : '' ); // input var okay. $ssl_path = ( isset( $_REQUEST['remote_certificate_path'] ) ? sanitize_text_field( wp_unslash( $_REQUEST['remote_certificate_path'] ) ) : '' ); // input var okay. $ssl_cipher = ( isset( $_REQUEST['remote_specified_cipher'] ) ? sanitize_text_field( wp_unslash( $_REQUEST['remote_specified_cipher'] ) ) : '' ); // input var okay. if ( '' === $database || '' === $host || '' === $user || '' === $schema ) { $msg = new WPDA_Message_Box(array( 'message_text' => sprintf( __( 'Cannot add remote database connection [missing argument]', 'wp-data-access' ) ), 'message_type' => 'error', 'message_is_dismissible' => false, )); $msg->box(); return; } if ( 'rdb:' === $database ) { $msg = new WPDA_Message_Box(array( 'message_text' => sprintf( __( 'Invalid database name [enter a valid database name, for example rdb:remotedb]', 'wp-data-access' ) ), 'message_type' => 'error', 'message_is_dismissible' => false, )); $msg->box(); return; } if ( !WPDADB::add_remote_database( $database, $host, $user, $passwd, $port, $schema, $ssl, $ssl_key, $ssl_cert, $ssl_ca, $ssl_path, $ssl_cipher ) ) { $msg = new WPDA_Message_Box(array( 'message_text' => sprintf( __( 'Cannot add remote database connection', 'wp-data-access' ) ), 'message_type' => 'error', 'message_is_dismissible' => false, )); $msg->box(); } else { $msg = new WPDA_Message_Box(array( 'message_text' => sprintf( __( 'Remote database connection `%s` added', 'wp-data-access' ), $database ), )); $msg->box(); $this->switch_schema_name = $database; } } } private function drop_db() { if ( !$this->check_wpnonce( 'wpda-drop-db-from-data-explorer-' . WPDA::get_current_user_login(), '_wpnoncedropdb' ) ) { return; } if ( !isset( $_REQUEST['database'] ) ) { $msg = new WPDA_Message_Box(array( 'message_text' => sprintf( __( 'Cannot drop database [missing argument]', 'wp-data-access' ) ), 'message_type' => 'error', 'message_is_dismissible' => false, )); $msg->box(); return; } global $wpdb; $database = str_replace( '`', '', sanitize_text_field( wp_unslash( $_REQUEST['database'] ) ) ); // input var okay. if ( 'rdb:' === substr( $database, 0, 4 ) ) { // Delete remote database if ( false === WPDADB::get_remote_database( $database ) ) { $msg = new WPDA_Message_Box(array( 'message_text' => sprintf( __( 'Cannot delete remote database connection `%s` [remote database connection not found]', 'wp-data-access' ), $database ), 'message_type' => 'error', 'message_is_dismissible' => false, )); $msg->box(); } else { if ( false === WPDADB::del_remote_database( $database ) ) { $msg = new WPDA_Message_Box(array( 'message_text' => sprintf( __( 'Cannot delete remote database connection `%s`', 'wp-data-access' ), $database ), 'message_type' => 'error', 'message_is_dismissible' => false, )); $msg->box(); } else { $msg = new WPDA_Message_Box(array( 'message_text' => sprintf( __( 'Remove database `%s` deleted', 'wp-data-access' ), $database ), )); $msg->box(); $this->switch_schema_name = $wpdb->dbname; } } } else { // Drop local database if ( $wpdb->dbname === $database ) { $msg = new WPDA_Message_Box(array( 'message_text' => __( 'Cannot drop WordPress database', 'wp-data-access' ), 'message_type' => 'error', 'message_is_dismissible' => false, )); $msg->box(); return; } if ( 'sys' === $database || 'mysql' === $database || 'information_schema' === $database || 'performance_schema' === $database || '' === $database ) { $msg = new WPDA_Message_Box(array( 'message_text' => __( 'Cannot drop MySQL database', 'wp-data-access' ), 'message_type' => 'error', 'message_is_dismissible' => false, )); $msg->box(); return; } if ( false === $wpdb->query( $wpdb->prepare( 'drop database `%1s`', // phpcs:ignore WordPress.DB.PreparedSQLPlaceholders array(WPDA::remove_backticks( $database )) ) ) ) { // db call ok; no-cache ok. $msg = new WPDA_Message_Box(array( 'message_text' => sprintf( __( 'Error dropping database `%s`', 'wp-data-access' ), $database ), 'message_type' => 'error', 'message_is_dismissible' => false, )); $msg->box(); } else { $msg = new WPDA_Message_Box(array( 'message_text' => sprintf( __( 'Database `%s` dropped', 'wp-data-access' ), $database ), )); $msg->box(); $this->switch_schema_name = $wpdb->dbname; } } } private function edit_db() { if ( !$this->check_wpnonce( 'wpda-edit-db-from-data-explorer-' . WPDA::get_current_user_login(), '_wpnonceeditdb' ) ) { return; } if ( !isset( $_REQUEST['edit_remote_database'] ) ) { $msg = new WPDA_Message_Box(array( 'message_text' => sprintf( __( 'Cannot update remote database connection [missing argument]', 'wp-data-access' ) ), 'message_type' => 'error', 'message_is_dismissible' => false, )); $msg->box(); return; } $database = sanitize_text_field( wp_unslash( $_REQUEST['edit_remote_database'] ) ); // input var okay. $database_old = sanitize_text_field( wp_unslash( $_REQUEST['edit_remote_database_old'] ) ); // input var okay. if ( $database !== $database_old ) { // Update database connection name if ( false === WPDADB::get_remote_database( $database_old ) ) { $msg = new WPDA_Message_Box(array( 'message_text' => sprintf( __( 'Cannot update remote database connection [remote database connection not found]', 'wp-data-access' ) ), 'message_type' => 'error', 'message_is_dismissible' => false, )); $msg->box(); return; } } else { // Update database connection information if ( false === WPDADB::get_remote_database( $database ) ) { $msg = new WPDA_Message_Box(array( 'message_text' => sprintf( __( 'Cannot update remote database connection [remote database connection not found]', 'wp-data-access' ) ), 'message_type' => 'error', 'message_is_dismissible' => false, )); $msg->box(); return; } } $host = ( isset( $_REQUEST['edit_remote_host'] ) ? sanitize_text_field( wp_unslash( $_REQUEST['edit_remote_host'] ) ) : '' ); // input var okay. $user = ( isset( $_REQUEST['edit_remote_user'] ) ? sanitize_text_field( wp_unslash( $_REQUEST['edit_remote_user'] ) ) : '' ); // input var okay. $passwd = ( isset( $_REQUEST['edit_remote_passwd'] ) ? wp_unslash( $_REQUEST['edit_remote_passwd'] ) : '' ); // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized $port = ( isset( $_REQUEST['edit_remote_port'] ) ? sanitize_text_field( wp_unslash( $_REQUEST['edit_remote_port'] ) ) : '' ); // input var okay. $schema = ( isset( $_REQUEST['edit_remote_schema'] ) ? sanitize_text_field( wp_unslash( $_REQUEST['edit_remote_schema'] ) ) : '' ); // input var okay. $ssl = ( isset( $_REQUEST['edit_remote_ssl'] ) ? sanitize_text_field( wp_unslash( $_REQUEST['edit_remote_ssl'] ) ) : 'off' ); // input var okay. $ssl_key = ( isset( $_REQUEST['edit_remote_client_key'] ) ? sanitize_text_field( wp_unslash( $_REQUEST['edit_remote_client_key'] ) ) : '' ); // input var okay. $ssl_cert = ( isset( $_REQUEST['edit_remote_client_certificate'] ) ? sanitize_text_field( wp_unslash( $_REQUEST['edit_remote_client_certificate'] ) ) : '' ); // input var okay. $ssl_ca = ( isset( $_REQUEST['edit_remote_ca_certificate'] ) ? sanitize_text_field( wp_unslash( $_REQUEST['edit_remote_ca_certificate'] ) ) : '' ); // input var okay. $ssl_path = ( isset( $_REQUEST['edit_remote_certificate_path'] ) ? sanitize_text_field( wp_unslash( $_REQUEST['edit_remote_certificate_path'] ) ) : '' ); // input var okay. $ssl_cipher = ( isset( $_REQUEST['edit_remote_specified_cipher'] ) ? sanitize_text_field( wp_unslash( $_REQUEST['edit_remote_specified_cipher'] ) ) : '' ); // input var okay. if ( '' === $database || '' === $host || '' === $user || '' === $schema ) { $msg = new WPDA_Message_Box(array( 'message_text' => sprintf( __( 'Cannot edit remote database connection [missing arguments]', 'wp-data-access' ) ), 'message_type' => 'error', 'message_is_dismissible' => false, )); $msg->box(); return; } if ( !WPDADB::upd_remote_database( $database, $host, $user, $passwd, $port, $schema, false, $database_old, $ssl, $ssl_key, $ssl_cert, $ssl_ca, $ssl_path, $ssl_cipher ) ) { $msg = new WPDA_Message_Box(array( 'message_text' => sprintf( __( 'Cannot update remote database connection `%s`', 'wp-data-access' ), $database ), 'message_type' => 'error', 'message_is_dismissible' => false, )); $msg->box(); } else { $msg = new WPDA_Message_Box(array( 'message_text' => sprintf( __( 'Remote database connection `%s` updated', 'wp-data-access' ), $database ), )); $msg->box(); if ( $database !== $database_old ) { $this->switch_schema_name = $database; } } } private function check_wpnonce( $wp_nonce_action, $wp_nonce_arg ) { $wp_nonce = ( isset( $_REQUEST[$wp_nonce_arg] ) ? sanitize_text_field( wp_unslash( $_REQUEST[$wp_nonce_arg] ) ) : '' ); // input var okay. if ( !wp_verify_nonce( $wp_nonce, $wp_nonce_action ) ) { $msg = new WPDA_Message_Box(array( 'message_text' => __( 'Not authorized', 'wp-data-access' ), 'message_type' => 'error', 'message_is_dismissible' => false, )); $msg->box(); return false; } return true; } public function show() { if ( null !== $this->page ) { $this->add_containers(); } } private function add_containers() { ?> <div id="wpda_manage_databases"> <div id="wpda_db_tabs"> <ul> <li><a href="#wpda_tab-1">Management Databases</a></li> <li><a href="#wpda_tab-2">Create Remote Database Connection</a></li> <li><a href="#wpda_tab-3">Create Local Database</a></li> </ul> <div class="container" id="wpda_tab-1"> <?php $this->manage_databases(); ?> </div> <div class="container" id="wpda_tab-2"> <?php $this->create_remote_database(); ?> </div> <div class="container" id="wpda_tab-3"> <?php $this->create_local_database(); ?> </div> </div> <div class="wpda_manage_databases_close"> <a href="javascript:void(0)" onclick="jQuery('#wpda_manage_databases').hide()"><i class="fas fa-xmark wpda_icon_on_button"></i> </a> </div> </div> <?php $this->drop_database(); ?> <?php $this->js(); $this->css(); } private function manage_databases() { $tree = new WPDA_Tree(); $dbs = $tree->get_dbs(); $this->rdb = array(); $mdbs = array( '' => '', ); if ( isset( $dbs->data['data'] ) ) { $dbs_list = $dbs->data['data']; foreach ( $dbs_list as $db ) { if ( 'local' === $db['dbs_type'] || 'remote' === $db['dbs_type'] ) { // Admins can manage local and remote database only. $mdbs[$db['dbs']] = $db['dbs_type']; if ( 'remote' === $db['dbs_type'] ) { // Store remote database info. $this->rdb[$db['dbs']] = WPDADB::get_remote_database( $db['dbs'] ); } } } } ?> <h3 class="wpda_db_title"> <?php echo __( 'Manage Databases', 'wp-data-access' ); ?> </h3> <?php if ( 1 === count( $mdbs ) ) { $this->no_database(); } else { $this->list_databases( $mdbs ); } } private function activate_pds() { ?> <div class="restyle_link"> <strong>NOTE</strong> Please activate your Premium Data Services access <a href="options-general.php?page=wpdataaccess&tab=pds">here</a> to remotely connect to foreign DBMSs and remote files. <a href="https://wpdataaccess.com/docs/remote-connection-wizard/remote-connection-wizard/" class="restyle_link" target="_blank">(read more...)</a> </div> <?php } private function no_database() { echo __( 'No manageable local databases or remote database connections found', 'wp-data-access' ); } private function list_databases( $dbs ) { ?> <div class="wpda_manage_dbs"> <label for="edit_remote_database" class="database_item_label">Select database:</label> <select id="manage_db_selection"> <?php foreach ( $dbs as $db => $db_type ) { echo "<option value='{$db}' data-type='{$db_type}'>{$db}</option>"; } ?> </select> </div> <?php $this->edit_local_database(); $this->edit_remote_database(); } private function edit_local_database() { ?> <div id="edit_local_database_form"> <label for="edit_local_database" class="database_item_label">Database name:</label> <input type="text" name="edit_local_database" id="edit_local_database" readonly> <a href="javascript:void(0)" id="edit_local_database_action" class="button button-primary"><i class="fas fa-trash wpda_icon_on_button"></i> Drop database </a> </div> <?php } private function edit_remote_database() { ?> <form method="post" action="?page=<?php echo esc_attr( $this->page ); ?>" onsubmit="return editdb_validate_form();" id="edit_remote_database_form" > <div> <label for="edit_remote_database" class="database_item_label">Database name:</label> <input type="text" name="edit_remote_database" id="edit_remote_database"> <input type="hidden" name="edit_remote_database_old" id="edit_remote_database_old"> <a href="javascript:void(0)" id="remote_local_database_action" class="button button-secondary"><i class="fas fa-trash wpda_icon_on_button"></i> Drop database </a> </div> <div> <label for="edit_remote_host" class="database_item_label">MySQL host:</label> <input type="text" name="edit_remote_host" id="edit_remote_host"> </div> <div> <label for="edit_remote_user" class="database_item_label">MySQL username:</label> <input type="text" name="edit_remote_user" id="edit_remote_user"> </div> <div> <label for="edit_remote_passwd" class="database_item_label">MySQL password:</label> <input type="password" name="edit_remote_passwd" id="edit_remote_passwd" autocomplete="new-password"> <i class="fas fa-eye" onclick="wpda_toggle_password('edit_remote_passwd', event)" style="cursor:pointer"></i> </div> <div> <label for="edit_remote_port" class="database_item_label">MySQL port:</label> <input type="text" name="edit_remote_port" id="edit_remote_port"> </div> <div> <label for="edit_remote_schema" class="database_item_label">MySQL schema:</label> <input type="text" name="edit_remote_schema" id="edit_remote_schema"> </div> <div class="wpda_db_ssl"> <label for="edit_remote_ssl" class="database_item_label">SSL:</label> <input type="checkbox" name="edit_remote_ssl" id="edit_remote_ssl" onclick="jQuery('#edit_remote_database_block_ssl').toggle()"> </div> <div id="edit_remote_database_block_ssl"> <div> <label for="edit_remote_client_key" class="database_item_label">Client key:</label> <input type="text" name="edit_remote_client_key" id="edit_remote_client_key"> </div> <div> <label for="edit_remote_client_certificate" class="database_item_label">Client certificate:</label> <input type="text" name="edit_remote_client_certificate" id="edit_remote_client_certificate"> </div> <div> <label for="edit_remote_ca_certificate" class="database_item_label">CA certificate:</label> <input type="text" name="edit_remote_ca_certificate" id="edit_remote_ca_certificate"> </div> <div> <label for="edit_remote_certificate_path" class="database_item_label">Certificate path:</label> <input type="text" name="edit_remote_certificate_path" id="edit_remote_certificate_path"> </div> <div> <label for="edit_remote_specified_cipher" class="database_item_label">Specified Cipher:</label> <input type="text" name="edit_remote_specified_cipher" id="edit_remote_specified_cipher"> </div> </div> <div> <label class="database_item_label"></label> <input type="button" value="Test" onclick="test_remote_connection('edit_'); return false;" id="edit_remote_test_button" class="button"> <input type="button" value="Clear" onclick="test_remote_clear('edit_'); return false;" id="edit_remote_clear_button" class="button"> </div> <div id="edit_remote_database_block_test"> <div id="edit_remote_database_block_test_content" class="remote_database_block_test_content"></div> </div> <input type="hidden" name="action" value="edit_db"> <?php wp_nonce_field( 'wpda-edit-db-from-data-explorer-' . WPDA::get_current_user_login(), '_wpnonceeditdb', false ); ?> <?php $this->buttons(); ?> </form> <?php } private function create_local_database() { ?> <h3 class="wpda_db_title"> <?php echo __( 'Create local database', 'wp-data-access' ); ?> </h3> <?php if ( !$this->user_can_create_db ) { echo __( 'You are not authorized to create local databases', 'wp-data-access' ); } else { ?> <form method="post" action="?page=<?php echo esc_attr( $this->page ); ?>" onsubmit="return createdb_validate_form_local();" > <div> <label for="local_database" class="database_item_label">Database name:</label> <input type="text" name="local_database" id="local_database"> </div> <input type="hidden" name="action" value="create_db"> <input type="hidden" name="database_location" value="local"> <?php wp_nonce_field( 'wpda-create-db-from-data-explorer-' . WPDA::get_current_user_login(), '_wpnoncecreatedb', false ); ?> <?php $this->buttons(); ?> </form> <?php } } private function create_remote_database() { ?> <form method="post" action="?page=<?php echo esc_attr( $this->page ); ?>" onsubmit="return createdb_validate_form_remote();"> <h3 class="wpda_db_title"> <?php echo __( 'Create remote database connection', 'wp-data-access' ); ?> </h3> <div> <label for="remote_database" class="database_item_label">Database name:</label> <input type="text" name="remote_database" id="remote_database" value="rdb:"> </div> <div> <label for="remote_host" class="database_item_label">MySQL host:</label> <input type="text" name="remote_host" id="remote_host"> </div> <div> <label for="remote_user" class="database_item_label">MySQL username:</label> <input type="text" name="remote_user" id="remote_user"> </div> <div> <label for="remote_passwd" class="database_item_label">MySQL password:</label> <input type="password" name="remote_passwd" id="remote_passwd" autocomplete="new-password"> <i class="fas fa-eye" onclick="wpda_toggle_password('remote_passwd', event)" style="cursor:pointer"></i> </div> <div> <label for="remote_port" class="database_item_label">MySQL port:</label> <input type="text" name="remote_port" id="remote_port" value="3306"> </div> <div> <label for="remote_schema" class="database_item_label">MySQL schema:</label> <input type="text" name="remote_schema" id="remote_schema"> </div> <div class="wpda_db_ssl"> <label for="remote_ssl" class="database_item_label">SSL:</label> <input type="checkbox" name="remote_ssl" id="remote_ssl" unchecked onclick="jQuery('#remote_database_block_ssl').toggle()"> </div> <div id="remote_database_block_ssl"> <div> <label for="remote_client_key" class="database_item_label">Client key:</label> <input type="text" name="remote_client_key" id="remote_client_key"> </div> <div> <label for="remote_client_certificate" class="database_item_label">Client certificate:</label> <input type="text" name="remote_client_certificate" id="remote_client_certificate"> </div> <div> <label for="remote_ca_certificate" class="database_item_label">CA certificate:</label> <input type="text" name="remote_ca_certificate" id="remote_ca_certificate"> </div> <div> <label for="remote_certificate_path" class="database_item_label">Certificate path:</label> <input type="text" name="remote_certificate_path" id="remote_certificate_path"> </div> <div> <label for="remote_specified_cipher" class="database_item_label">Specified Cipher:</label> <input type="text" name="remote_specified_cipher" id="remote_specified_cipher"> </div> </div> <div> <label class="database_item_label"></label> <input type="button" value="Test" onclick="test_remote_connection(); return false;" id="remote_test_button" class="button"> <input type="button" value="Clear" onclick="test_remote_clear(); return false;" id="remote_clear_button" class="button" style="display:none;"> </div> <div id="remote_database_block_test"> <div id="remote_database_block_test_content" class="remote_database_block_test_content"></div> </div> <input type="hidden" name="action" value="create_db"> <input type="hidden" name="database_location" value="remote"> <?php wp_nonce_field( 'wpda-create-db-from-data-explorer-' . WPDA::get_current_user_login(), '_wpnoncecreatedb', false ); ?> <?php $this->buttons(); ?> </form> <?php } private function buttons() { ?> <div class="wpda_db_buttons"> <a href="javascript:void(0)" onclick="jQuery(this).closest('form').submit()" class="button button-primary"><i class="fas fa-cloud-upload wpda_icon_on_button"></i> <?php echo __( 'Save', 'wp-data-access' ); ?> </a> <a href="javascript:void(0)" onclick="jQuery('#wpda_manage_databases').hide()" class="button button-secondary"><i class="fas fa-times-circle wpda_icon_on_button"></i> <?php echo __( 'Cancel', 'wp-data-access' ); ?> </a> </div> <?php } private function drop_database() { ?> <form id="wpda_form_drop_db" method="post" action="?page=<?php echo esc_attr( $this->page ); ?>" > <input type="hidden" name="database" id="drop_database"> <input type="hidden" name="action" value="drop_db"> <?php wp_nonce_field( 'wpda-drop-db-from-data-explorer-' . WPDA::get_current_user_login(), '_wpnoncedropdb', false ); ?> </form> <?php } private function js() { ?> <script> function editdb_validate_form() { if (jQuery('#edit_remote_database').val() === '' || jQuery('#edit_remote_database').val() === 'rdb:') { alert('Database name must be entered'); return false; } if (jQuery('#edit_remote_host').val() === '') { alert('MySQL host must be entered'); return false; } if (jQuery('#edit_remote_user').val() === '') { alert('MySQL username must be entered'); return false; } if (jQuery('#edit_remote_schema').val() === '') { alert('MySQL schema must be entered'); return false; } return true; } function createdb_validate_form_remote() { if (jQuery('#remote_database').val() === '' || jQuery('#remote_database').val() === 'rdb:') { alert('Database name must be entered'); return false; } if (jQuery('#remote_host').val() === '') { alert('MySQL host must be entered'); return false; } if (jQuery('#remote_user').val() === '') { alert('MySQL username must be entered'); return false; } if (jQuery('#remote_schema').val() === '') { alert('MySQL schema must be entered'); return false; } return true; } function createdb_validate_form_local() { if (jQuery('#local_database').val() === '') { alert('Database name must be entered'); return false; } return true; } function test_remote_clear(mode = '') { jQuery('#' + mode + 'remote_database_block_test_content').html(''); jQuery('#' + mode + 'remote_database_block_test').hide(); jQuery('#' + mode + 'remote_clear_button').hide(); } function test_remote_connection(mode = '') { host = jQuery('#' + mode + 'remote_host').val(); user = jQuery('#' + mode + 'remote_user').val(); pass = jQuery('#' + mode + 'remote_passwd').val(); port = jQuery('#' + mode + 'remote_port').val(); dbs = jQuery('#' + mode + 'remote_schema').val(); ssl = jQuery('#' + mode + 'remote_ssl').val(); ssl_key = jQuery('#' + mode + 'remote_client_key').val(); ssl_cert = jQuery('#' + mode + 'remote_client_certificate').val(); ssl_ca = jQuery('#' + mode + 'remote_ca_certificate').val(); ssl_path = jQuery('#' + mode + 'remote_certificate_path').val(); ssl_cipher = jQuery('#' + mode + 'remote_specified_cipher').val(); url = '//' + window.location.host + window.location.pathname + '?action=wpda_check_remote_database_connection'; jQuery('#' + mode + 'remote_test_button').val('Testing...'); jQuery.ajax({ method: 'POST', url: url, data: { host: host, user: user, passwd: pass, port: port, schema: dbs, ssl: ssl, ssl_key: ssl_key, ssl_cert: ssl_cert, ssl_ca: ssl_ca, ssl_path: ssl_path, ssl_cipher: ssl_cipher } }).done( function (msg) { jQuery('#' + mode + 'remote_database_block_test_content').html(msg); jQuery('#' + mode + 'remote_database_block_test').show(); } ).fail( function () { jQuery('#' + mode + 'remote_database_block_test_content').html('Preparing connection...<br/>Establishing connection...<br/><br/><strong>Remote database connection invalid</strong>'); jQuery('#' + mode + 'remote_database_block_test').show(); } ).always( function () { jQuery('#' + mode + 'remote_test_button').val('Test'); jQuery('#' + mode + 'remote_clear_button').show(); } ); } jQuery(function () { jQuery('#database_location').on('change', function () { if (jQuery(this).val() === 'remote') { jQuery('#local_database_block').hide(); jQuery('#remote_database_block').show(); } else { jQuery('#remote_database_block').hide(); jQuery('#local_database_block').show(); } }); jQuery('#remote_database, #edit_remote_database').keydown(function () { var field = this; setTimeout(function () { if (field.value.indexOf('rdb:') !== 0) { jQuery(field).val('rdb:'); } }, 1); }); jQuery('#wpda_db_tabs').tabs(); jQuery("#manage_db_selection").on('change', function () { const db_name = this.value; const db_type = jQuery("#manage_db_selection").find(':selected').data("type"); if (db_type === 'local') { jQuery("#edit_remote_database_form").hide(); jQuery("#edit_local_database_form").show(); jQuery("#edit_local_database").val(db_name); } else { jQuery("#edit_local_database_form").hide(); jQuery("#edit_remote_database_form").show(); if (wpda_rdb[db_name]) { // Load remote database info const rdb = wpda_rdb[db_name]; jQuery("#edit_remote_database").val(db_name) jQuery("#edit_remote_database_old").val(db_name) jQuery("#edit_remote_host").val(rdb.host) jQuery("#edit_remote_user").val(rdb.username) jQuery("#edit_remote_passwd").val(rdb.password) jQuery("#edit_remote_port").val(rdb.port) jQuery("#edit_remote_schema").val(rdb.database) jQuery("#edit_remote_ssl").prop("checked", rdb.ssl === "on") jQuery("#edit_remote_client_key").val(rdb.ssl_key) jQuery("#edit_remote_client_certificate").val(rdb.ssl_cert) jQuery("#edit_remote_ca_certificate").val(rdb.ssl_ca) jQuery("#edit_remote_certificate_path").val(rdb.ssl_path) jQuery("#edit_remote_specified_cipher").val(rdb.ssl_cipher) if (rdb.ssl === "on") { jQuery('#edit_remote_database_block_ssl').show(); } else { jQuery('#edit_remote_database_block_ssl').hide(); } } else { if (db_name !== "") { alert("Database not found"); jQuery("#edit_remote_database_form").hide(); } else { jQuery("#edit_remote_database_form").hide(); jQuery("#edit_local_database_form").hide(); } } } }) jQuery("#edit_local_database_action").on('click', function () { if (confirm('Warning! All your tables and views will be deleted. This action cannot be undone! Are you sure you want to delete this database?')) { jQuery("#drop_database").val(jQuery("#edit_local_database").val()) jQuery("#wpda_form_drop_db").submit(); } }) jQuery("#remote_local_database_action").on('click', function () { if (confirm('Warning! All your tables and views will be deleted. This action cannot be undone! Are you sure you want to delete this database?')) { jQuery("#drop_database").val(jQuery("#edit_remote_database").val()) jQuery("#wpda_form_drop_db").submit(); } }) }); var wpda_rdb = <?php echo json_encode( $this->rdb ); ?>; </script> <?php } private function css() { ?> <style> #wpda_manage_databases { position: relative; display: none; padding: 24px; margin-bottom: 5px; border-radius: 4px; background-color: #fff; color: rgba(0, 0, 0, 0.87); -webkit-transition: box-shadow 300ms cubic-bezier(0.4, 0, 0.2, 1) 0ms; transition: box-shadow 300ms cubic-bezier(0.4, 0, 0.2, 1) 0ms; box-shadow: 0px 2px 4px -1px rgba(0, 0, 0, 0.2), 0px 4px 5px 0px rgba(0, 0, 0, 0.14), 0px 1px 10px 0px rgba(0, 0, 0, 0.12); } #wpda_db_tabs { border: none; } #wpda_db_tabs ul { background: none; border-top: none; border-right: none; border-left: none; border-radius: 0; } #edit_remote_clear_button, #edit_remote_database_block_test, #wpda_form_drop_db, #remote_database_block_ssl, #remote_database_block_test, #edit_remote_database_form, #edit_local_database_form { display: none; } #edit_remote_database_block_ssl, #remote_database_block_ssl { margin-bottom: 10px; } #edit_remote_database_block_test, #remote_database_block_test { margin-top: 10px; } .wpda_manage_dbs, .wpda_db_title { margin-bottom: 30px; } .database_item_label { vertical-align: baseline; } .wpda_db_ssl { margin-top: 10px; margin-bottom: 10px; } .wpda_db_buttons { margin-top: 30px; } .wpda_manage_databases_close { position: absolute; top: 22px; right: 22px; z-index: 9999999; font-size: 1rem; } .wpda_manage_databases_close .fas { color: rgb(60, 67, 74); } .restyle_link a { color: #2271b1; text-decoration: none; font-weight: 700; } </style> <?php } }