mariuz/firebirdwebadmin

View on GitHub
database.php

Summary

Maintainability
A
25 mins
Test Coverage
<?php

// Purpose        do all the tasks concerning databases
// Author         Lutz Brueckner <irie@gmx.de>
// Copyright      (c) 2000-2006 by Lutz Brueckner,
//                published under the terms of the GNU General Public Licence v.2,
//                see file LICENCE for details

require './inc/script_start.inc.php';

//
// script is called from login form
//
if (isset($_POST['db_login_doit'])) {
    // close existing connection, if any
    if (!empty($dbhandle)) {
        fbird_close($dbhandle);
    }
    $s_login['database'] = $_POST['db_login_database'];
    $s_login['user'] = strtoupper($_POST['db_login_user']);
    $s_login['host'] = $_POST['db_login_host'];

    // don't set s_login['password'] if it contains only stars
    // (from function password_stars())
    $pw = $_POST['db_login_password'];
    if (strspn($pw, '*') != strlen($pw)) {
        $s_login['password'] = $pw;
    }

    $s_login['role'] = !empty($_POST['db_login_role'])  ? $_POST['db_login_role']  : '';
    $s_login['cache'] = !empty($_POST['db_login_cache']) ? $_POST['db_login_cache'] : '';
    if ($s_login['cache'] != null  &&  $s_login['cache'] < 10) {
        $s_login['cache'] = 10;
    }
    $s_login['charset'] = !empty($_POST['db_login_charset']) ? $_POST['db_login_charset'] : '';
    $s_login['dialect'] = !empty($_POST['db_login_dialect']) ? $_POST['db_login_dialect'] : '';
    $s_login['server'] = !empty($_POST['db_login_server'])  ? $_POST['db_login_server']  : '';

    if ($s_login['database'] == '') {
        $error = $ERRORS['NO_DB_SELECTED'];
    } elseif (!is_allowed_db($s_login['database'])) {
        $error = sprintf($ERRORS['DB_NOT_ALLOWED'], $s_login['database']);
    }

    if (empty($error)) {
        if ($dbhandle = db_connect()) {

            // connected successfully
            $s_connected = true;

            remove_edit_panels();
            $s_charsets = get_charsets();
            $message = $info_strings['SuccessLogin'];
        } else {
            // connect failed
            $fb_error = fbird_errmsg();
            $s_login['password'] = '';
            $s_connected = false;
        }
    }
    cleanup_session();
}

//
// the Logout-Button from the login-panel
//
if (isset($_POST['db_logout_doit'])) {
    if (!empty($dbhandle)) {
        fbird_close($dbhandle);
    }
    remove_edit_panels();
    cleanup_session();
    $s_login['password'] = '';

    $s_connected = false;
}

//
// script is called from create database form
//
if (have_panel_permissions($s_login['user'], 'db_create')
&&  isset($_POST['db_create_doit'])
&&  isset($_POST['db_create_database'])
&&  !empty($_POST['db_create_database'])) {
    $s_create_db = trim($_POST['db_create_database']);
    $s_create_host = trim($_POST['db_create_host']);
    $s_create_user = trim($_POST['db_create_user']);

    // dont set $s_create_pw if it contains only stars
    // (from function password_stars() )
    $pw = $_POST['db_create_password'];
    if (strspn($pw, '*') != strlen($pw)) {
        $s_create_pw = $pw;
    }
    $s_create_pagesize = $_POST['db_create_pagesize'];
    $s_create_charset = $_POST['db_create_charset'];

    if (!is_allowed_db($s_create_db)) {
        $error = sprintf($ERRORS['DB_NOT_ALLOWED'], $s_create_db);
    }

    // close existing connection, if any
    if (!empty($dbhandle)  &&  empty($error)) {
        fbird_close($dbhandle);
    }

    // build a sql statement from the values
    // we received from the db_create_form
    if (empty($error)) {
        $db_str = (!empty($s_create_host)) ? $s_create_host.':'.$s_create_db : $s_create_db;

        $sql = 'CREATE DATABASE \''.$db_str.'\'';
        if (strlen($s_create_user) > 0) {
            $sql .= ' USER \''.$s_create_user.'\'';
            if (strlen($s_create_pw) > 0) {
                $sql .= ' PASSWORD \''.$s_create_pw.'\'';
            }
        }
        if ($s_create_pagesize !=   4096) {
            //  4096 is the default page size
            $sql .= ' PAGE_SIZE = '.$s_create_pagesize;
        }

        if ($s_create_charset != 'NONE') {
            // NONE is the default character set
            $sql .= ' DEFAULT CHARACTER SET '.$s_create_charset;
        }

        $sql .= ';';
        list($binary_output, $binary_error) = isql_execute($sql);

        if (empty($binary_error)  &&  !is_file($s_create_db)) {
            $error = sprintf($ERRORS['CREATE_DB_FAILED'], $s_create_db);
        } else { // connect the new created database

            $s_login['charset'] = $s_create_charset;
            $s_login['database'] = $s_create_db;
            $s_login['host'] = $s_create_host;
            $s_login['user'] = strtoupper($s_create_user);
            $s_login['password'] = $s_create_pw;
            if ($dbhandle = db_connect()) {
                $s_connected = true;
                remove_edit_panels();
                cleanup_session();
                $message = sprintf($MESSAGES['CREATE_DB_SUCCESS'], $s_create_db);
            } else {
                $fb_error = fbird_errmsg();
            }
        }
    }
}

//
// script is called from delete database form
//
if (have_panel_permissions($s_login['user'], 'db_delete')
&&  isset($_POST['db_delete_doit'])
&&  isset($_POST['db_delete_database'])
&&  !empty($_POST['db_delete_database'])) {
    $pw = get_request_data('db_delete_password');
    if (strspn($pw, '*') == strlen($pw)) {
        $pw = $s_delete_db['password'];
    }
    $s_delete_db = array('database' => get_request_data('db_delete_database'),
                         'user' => get_request_data('db_delete_user'),
                         'host' => get_request_data('db_delete_host'),
                         'password' => $pw,
                         );

    // cannot delete the current database
    if ($s_login['database'] == $s_delete_db) {
        $message = sprintf($MESSAGES['DELETE_CON_DB'], $s_delete_db);
        $s_login['database'] = '';
        $s_connected = false;
        remove_edit_panels();
        cleanup_session();
    }

    if (!is_allowed_db($s_delete_db['database'])) {
        $error = sprintf($ERRORS['DB_NOT_ALLOWED'], $s_delete_db['database']);
    } elseif ($s_cust['askdel'] == true) {
        $s_confirmations['database'] =
            array('msg' => sprintf($MESSAGES['CONFIRM_DB_DELETE'], $s_delete_db['database']));
    }
}

// deleting a database is confirmed
if (isset($_POST['confirm_yes'])  ||
    (isset($_POST['db_delete_doit'])  &&  $s_cust['askdel'] == false  &&  empty($error))) {
    $fb_error = drop_database($s_delete_db, $s_login);
    unset($s_confirmations['database']);

    if (empty($fb_error)) {
        if ($s_login['database'] == $s_delete_db['database']) {
            $s_login['database'] = '';
            $s_connected = false;
            remove_edit_panels();
            cleanup_session();
        }

        $s_delete_db['database'] = '';
    }
}

// deleting a database is canceled
if (isset($_POST['confirm_no'])) {
    unset($s_confirmations['database']);
    $s_delete_db['database'] = '';
}

//
// get the data for the metadata panel
//
if (have_panel_permissions($s_login['user'], 'db_meta', true)) {

    // remove pending metadata-jobs from session
    $s_iframejobs = array_filter($s_iframejobs, function($a) {return '$a["job"]!="metadata";';} );

    $iframekey_meta = md5(uniqid('meta'));
    $s_iframejobs[$iframekey_meta] = array('job' => 'metadata',
                                           'timestamp' => time(), );

    //
    // Save to File on the Metadata panel was selected
    //
    if (isset($_POST['db_meta_save'])) {
        list($metadata, $binary_error) = isql_get_metadata($s_login['user'], $s_login['password'], $s_login['database'], $s_login['host']);

        if (empty($binary_error)  &&  count($metadata) > 0) {
            send_export_headers('application/octet-stream', 'meta.sql');
            print(implode("\n", $metadata));
            exit();
        }
    }
}

//
// something happened on the System Tables panel
//
if (isset($_POST['db_systable_select'])) {
    if ($s_systable['table'] != $_POST['db_systable']) {
        $s_systable['order'] = '';
        $s_systable['dir'] = 'ASC';
    }

    $s_systable['table'] = $_POST['db_systable'];
    $s_systable['ffield'] = $_POST['db_sysfield'];
    $s_systable['fvalue'] = $_POST['db_sysvalue'];

    $s_systable['sysdata'] = (isset($_POST['db_sysdata']) ? true : false);
}

if (isset($_GET['order'])) {
    $s_systable['dir'] = ($_GET['order'] == $s_systable['order']  &&  $s_systable['dir'] == 'ASC')
        ? 'DESC'
        : 'ASC';
    $s_systable['order'] = $_GET['order'];
}

// determine the informations for the selected system table
if (have_panel_permissions($s_login['user'], 'db_systable', true)) {
    $js_stack .= js_request_filter_fields();

    if (false  &&  strpos($s_systable['table'], 'MON$') === 0) {
        // DISABLED !

        $have_refresh = true;
        // TODO: replace with XMLHttpRequest and markableTable()
        $js_stack .= js_jsrs_refresh_systable();
    } else {
        $have_refresh = false;
    }

    if ($s_connected   &&  !empty($s_systable['table'])) {
        include './inc/system_table.inc.php';

        $systable = get_systable($s_systable);
    }
}

//
// determine the accessible databases for the login panel
//
$dbfiles = array();
if (isset($ALLOWED_FILES)  && count($ALLOWED_FILES) > 0) {
    foreach ($ALLOWED_FILES as $file) {
        if ((strpos($file, '/') === false  &&  strpos($file, '\\') === false)  ||
            is_file($file)) {
            $dbfiles[] = $file;
        }
    }
} elseif (isset($ALLOWED_DIRS)  &&  count($ALLOWED_DIRS) > 0) {
    foreach ($ALLOWED_DIRS as $dir) {
        if (!@is_readable($dir)) {
            $warning .= sprintf($WARNINGS['CAN_NOT_ACCESS_DIR'], $dir);
        } else {
            $dirhandle = opendir($dir);
            while ($filename = readdir($dirhandle)) {
                    $dbfiles[] = $dir.$filename;
            }
            closedir($dirhandle);
        }
    }
}
sort($dbfiles);

//
// print out all the panels
//
$s_page = 'Database';
$panels = $s_database_panels;

require './inc/script_end.inc.php';

//
// drop the database specified in the 'delete database' panel;
// return an empty string on success and an error message on failure
//
function drop_database($db, $login)
{
    $success = '';

    // make a connection to the selected database
    // or use the global dbhandle if it is the one firebirdwebadmin is currently connected to
    if ($db['database'] == $login['database']  &&
        $db['host']  == $login['host']) {
        $dbh = $GLOBALS['dbhandle'];
    } else {
        $db_path = ($db['host'] == '') ? $db['database'] : $db['host'].':'.$db['database'];
        if (($dbh = fbird_connect($db_path, $db['user'], $db['password'])) == false) {
            $success = fbird_errmsg();
        }
    }

    // drop it if we got a handle
    if (is_resource($dbh)  &&
        fbird_drop_db($dbh) == false) {
        $success = fbird_errmsg();
        fbird_close($dbh);
    }

    return $success;
}