<?php 
namespace Jackbooted\Admin; 
 
use \Jackbooted\Config\Cfg; 
use \Jackbooted\DB\DB; 
use \Jackbooted\DB\DBMaintenance; 
use \Jackbooted\DB\DBTable; 
use \Jackbooted\Forms\Request; 
use \Jackbooted\Forms\Response; 
use \Jackbooted\G; 
use \Jackbooted\Html\Tag; 
use \Jackbooted\Html\WebPage; 
use \Jackbooted\Security\Privileges; 
use \Jackbooted\Util\PHPExt; 
/** 
 * @copyright Confidential and copyright (c) 2016 Jackbooted Software. All rights reserved. 
 * 
 * Written by Brett Dutton of Jackbooted Software 
 * brett at brettdutton dot com 
 * 
 * This software is written and distributed under the GNU General Public 
 * License which means that its source code is freely-distributed and 
 * available to the general public. 
 */ 
 
class SuperAdmin extends WebPage  { 
    const DEF = '\Jackbooted\Admin\SuperAdmin->index()'; 
 
    private static $completeMenu; 
    private static $userMenu; 
 
    public static function init () { 
        self::$completeMenu =  [ 'Run SQL Query'        => __CLASS__ . '->askSqlQuery()', 
                                 'Run Command'          => __CLASS__ . '->askCommand()', 
                                 'Update tblNextNumber' => __CLASS__ . '->updateNextNumber()', 
                                 'Reload Preferences'   => __CLASS__ . '->reloadPreferences()', 
                                 'File Checksum'        => __CLASS__ . '->fileChecksum()', 
                                 'Review Images'        => '\Jackbooted\Admin\ImagePositionLocator->index()', 
                                 'CRON Manager'         => '\Jackbooted\Cron\CronManager->index()', 
                                 'Schedule Manager'     => '\Jackbooted\Cron\SchedulerManager->index()', 
                ]; 
        self::$userMenu =  []; 
    } 
 
    public static function getMenu () { 
        if ( count ( self::$userMenu ) == 0 ) { 
            foreach ( self::$completeMenu as $title => $action ) { 
                if ( Privileges::access ( $action ) === true ) self::$userMenu[$title] = $action; 
            } 
        } 
        return self::$userMenu; 
    } 
 
    public static function menu () { 
        if ( Privileges::access ( __METHOD__ ) !== true || ! G::isLoggedIn () ) return ''; 
 
        $resp = new Response (); 
        $html = Tag::hTag ( 'b' ) . 'Super Admin Menu' . Tag::_hTag ( 'b' ) . 
                Tag::ul (  [ 'id' => 'menuList' ]); 
 
        foreach ( self::getMenu () as $title => $action ) { 
            $html .= Tag::li ( ) . 
                       Tag::hRef ( '?' . $resp->action ( $action )->toUrl (), $title ) . 
                     Tag::_li ( ); 
        } 
 
        $html .= Tag::_ul ( ); 
 
        return $html; 
    } 
 
    public function index () { 
        if ( ! G::isLoggedIn () ) { 
            return Login::controller( Login::DEF ); 
        } 
        else { 
            return 'Select item from menu'; 
        } 
    } 
 
    protected function askSqlQuery () { 
        $text = Request::get ( 'SQLTEXT' ); 
 
        $html = '<b>Direct SQL</b><br/>' . 
                  Tag::form ( ) . 
                    Response::factory ()->action ( __CLASS__ . '->runSqlQuery()' )->toHidden () . 
                    Tag::textArea ( 'SQLTEXT', $text,  [ 'rows' => 5, 'cols' => 40 ] ) . '<br/>' . 
                    Tag::submit ( 'Go' ) . 
                  Tag::_form (); 
        return $html; 
    } 
 
    protected function runSqlQuery () { 
        $sql = Request::get ( 'SQLTEXT' ); 
 
        if ( ! preg_match ( '/^(SELECT|SHOW|DESCRIBE).*$/im', $sql ) ) { 
            $html = '<br><b>SELECT SQL only</b>'; 
        } 
        else { 
            $html = DBTable::factory( DB::DEF, $sql, null, DB::FETCH_ASSOC )->__toString(); 
        } 
        return $this->askSqlQuery () . '<br/>' . $html; 
    } 
 
    protected function askCommand () { 
        $text = Request::get ( 'CMDTEXT' ); 
 
        $html = '<b>Direct Command Access</b><br/>' . 
                  Tag::form ( ) . 
                    Response::factory ()->action ( __CLASS__ . '->runCommand()' )->toHidden () . 
                    Tag::textArea ( 'CMDTEXT', $text,  [ 'rows' => 5, 'cols' => 40 ] ) . '<br/>' . 
                    Tag::submit ( 'Go' ) . 
                  Tag::_form (); 
        return $html; 
    } 
 
    protected function runCommand () { 
        $cmd = Request::get ( 'CMDTEXT' ); 
 
        echo '<pre>'; 
        echo htmlspecialchars ( system ( $cmd, $return_var ) ); 
        echo '</pre>'; 
        return $this->askCommand () . '<br/>Returned Value: ' . $return_var; 
    } 
 
    protected function updateNextNumber () { 
        $backMsg = ''; 
 
        $tableList = DBMaintenance::getTableList(); 
        foreach ( $tableList as $t ) { 
 
            // Make sure that it is our table and not something else 
            if ( preg_match ( '/^tbl.*$/', $t ) ) continue; 
 
            if ( DBMaintenance::addTableToNextNumber ( $t, 'XXX000000' ) ) $backMsg .= '<br/>Added ' . $t; 
        } 
 
        if ( $backMsg == '' ) $backMsg = '<br/>No Updates required'; 
 
        return '<b>Updated tblNextNumber</b>' . 
               $backMsg; 
    } 
 
    protected function reloadPreferences () { 
        Login::loadPreferences ( G::get ( 'fldUser' ) ); 
        return 'Reloaded Preferences'; 
    } 
 
    public function fileChecksum () { 
        $messageArray =  []; 
 
        $dirList = PHPExt::dirSearch ( Cfg::get ( 'site_path'  ), '/^[^_].*$/' ); 
        $len = strlen( Cfg::get ( 'site_path' ) ) + 1; 
        foreach ( $dirList as &$path ) $path = substr ( $path, $len ); 
        $tab = new DBTable ( DB::DEF, 'SELECT * FROM tblFileCheck' ); 
        foreach ( $tab as $row ) { 
            if ( in_array ( $row['fldFileName'] , $dirList ) ) { 
                $fullPath = Cfg::get ( 'site_path' ) . '/' . $row['fldFileName']; 
                $fileSize = filesize ( $fullPath ); 
                $sha1     = sha1_file ( $fullPath ); 
                if ( $fileSize != $row['fldSize'] ) { 
                    $messageArray[$row['fldFileName']] = 'Mismatch file size. was: ' . $row['fldSize'] . ' now: ' . $fileSize; 
                } 
                else if ( $sha1 != $row['fldCRC'] ) { 
                    $messageArray[$row['fldFileName']] = 'Mismatch SHA1. was: ' . $row['fldCRC'] . ' now: ' . $sha1; 
                } 
            } 
            else { 
                $messageArray[$row['fldFileName']] = 'File deleted'; 
            } 
        } 
 
        $oldFileList = $tab->getColumn ( 'fldFileName' ); 
        foreach ( $dirList as $fileName ) { 
            if ( ! in_array ( $fileName , $oldFileList ) ) { 
                $messageArray[$fileName] = 'New file'; 
            } 
        } 
 
        $html = ''; 
        if ( count ( $messageArray ) != 0 ) { 
            foreach ( $messageArray as $key => $val ) { 
                $html .= $key . ': ' . $val . '<br/>'; 
            } 
        } 
        else { 
            $html = 'No Changes<br/>'; 
        } 
 
        $rebaseButton = Tag::linkButton ( '?' . Response::factory()->action ( __CLASS__ . '->' . __FUNCTION__ . 'Rebase()' ), 'Rebase' ); 
        return $rebaseButton . '<br/>' . $html . $rebaseButton; 
    } 
 
    public function fileChecksumRebase () { 
        DB::exec ( DB::DEF, 'TRUNCATE tblFileCheck' ); 
 
        $dirList = PHPExt::dirSearch ( Cfg::get ( 'site_path'  ), '/^[^_].*$/' ); 
        $len = strlen( Cfg::get ( 'site_path' ) ) + 1; 
        $fileCount = 0; 
 
        foreach ( $dirList as $fullPath ) { 
            $fileCount ++; 
            DB::exec ( DB::DEF, 
                       'INSERT INTO tblFileCheck VALUES(?,?,?,?)', 
                        [ DBMaintenance::dbNextNumber ( DB::DEF, 'tblFileCheck' ), 
                          substr ( $fullPath, $len ), 
                          filesize ( $fullPath ), 
                          sha1_file ( $fullPath ) ] ); 
        } 
        return "Updated $fileCount files<br/>" . 
               $this->fileChecksum (); 
    } 
} 
 
 |