| 
<?phpnamespace 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 ();
 }
 }
 
 |