From 6e48a1fef85ea1c98c84cfa3d5635cfeed000645 Mon Sep 17 00:00:00 2001 From: n0nag0n Date: Wed, 6 Jan 2021 11:43:12 -0700 Subject: [PATCH] Add Manage Composer UI and updated adminer --- composer.json | 3 +- composer.lock | 38 +- config/webtools_config.ini | 4 + controllers/Manage_Composer_Controller.php | 90 + public/adminer/adminer.php | 4090 ++++++++++---------- ui/layout.htm | 3 + ui/manage_composer/index.htm | 60 + utils/ComposerInterfaceAdapter.php | 15 + 8 files changed, 2255 insertions(+), 2048 deletions(-) create mode 100644 controllers/Manage_Composer_Controller.php create mode 100644 ui/manage_composer/index.htm create mode 100644 utils/ComposerInterfaceAdapter.php diff --git a/composer.json b/composer.json index dccffba..0f171e1 100644 --- a/composer.json +++ b/composer.json @@ -12,7 +12,8 @@ "require": { "bcosca/fatfree-core": "^3.7", "ikkez/f3-flash": "^1.0", - "n0nag0n/fatfree-environment-check": "^0.1.0" + "n0nag0n/fatfree-environment-check": "^0.1.0", + "net-tools/composer-interface": "^1.0" }, "autoload": { "classmap" : [ "utils", "controllers", "models" ] diff --git a/composer.lock b/composer.lock index c0fbdb2..6465a1e 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "4126542fb094f2da558af47116a34d40", + "content-hash": "306277826ef42c4c2616defeb4b2ca8d", "packages": [ { "name": "bcosca/fatfree-core", @@ -110,6 +110,42 @@ "source": "https://github.com/n0nag0n/fatfree-environment-check/tree/0.1" }, "time": "2020-12-31T14:53:22+00:00" + }, + { + "name": "net-tools/composer-interface", + "version": "1.0.10", + "source": { + "type": "git", + "url": "https://github.com/net-tools/composer-interface.git", + "reference": "ff4eb8049a98392df9c7279ebee4e282d28a8088" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/net-tools/composer-interface/zipball/ff4eb8049a98392df9c7279ebee4e282d28a8088", + "reference": "ff4eb8049a98392df9c7279ebee4e282d28a8088", + "shasum": "" + }, + "require": { + "php": ">= 5.4.0" + }, + "type": "library", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Pierre", + "email": "dev@net-tools.ovh", + "role": "Developer" + } + ], + "description": "PHP shell interface to Composer when SSH is not available on your host ", + "support": { + "issues": "https://github.com/net-tools/composer-interface/issues", + "source": "https://github.com/net-tools/composer-interface/tree/master" + }, + "time": "2017-11-08T12:55:51+00:00" } ], "packages-dev": [], diff --git a/config/webtools_config.ini b/config/webtools_config.ini index 0090fa5..e8044e1 100644 --- a/config/webtools_config.ini +++ b/config/webtools_config.ini @@ -32,6 +32,10 @@ GET /models = n0nag0n\Model_Controller->indexAction GET /models/add = n0nag0n\Model_Controller->addAction POST /models/add = n0nag0n\Model_Controller->create +GET /config-check = n0nag0n\Config_Check_Controller->indexAction + +GET /manage-composer = n0nag0n\Manage_Composer_Controller->indexAction + [maps] [redirects] \ No newline at end of file diff --git a/controllers/Manage_Composer_Controller.php b/controllers/Manage_Composer_Controller.php new file mode 100644 index 0000000..af186f6 --- /dev/null +++ b/controllers/Manage_Composer_Controller.php @@ -0,0 +1,90 @@ +PROJECT_BASE_DIR, DIRECTORY_SEPARATOR))); + $root = rtrim($fw->PROJECT_BASE_DIR, '/'); + try + { + // create config object and set composer home (here, the parent folder of document root, so that other composer projects may benefit from global caching) + $raw_config = new stdClass; + $raw_config->composer_phpbin = PHP_BINARY; + $config = new \Nettools\ComposerInterface\Config($raw_config); + $composer_paths = [ + '/usr/local/bin/', + '/usr/bin/', + '~/', + $fw->PROJECT_BASE_DIR, + ]; + $composer_bin_location = ''; + foreach([ 'composer', 'composer.phar' ] as $composer_app_name) { + foreach($composer_paths as $path) { + if(file_exists($path.$composer_app_name)) { + $composer_bin_location = $path.$composer_app_name; + break 2; + } + } + } + $config->composer_bin_location = $composer_bin_location; + $config->composer_home = rtrim($fw->PROJECT_BASE_DIR, '/'); + + // create interface and set the composer project to be in folder PROJECT + $composer = new \ComposerInterfaceAdapter($config, $root); + + // global commands (not relative to a package or repository) + if ( $_REQUEST['composer'] ) + $ret = $composer->{$_REQUEST['composer']}(); + + + // package commands + else if ( $_REQUEST['package_cmd'] && $_REQUEST['package'] ) + $ret = $composer->{'package_' . $_REQUEST['package_cmd']}($_REQUEST['package']); + + + // repositories commands + else if ( $_REQUEST['repository_cmd'] && $_REQUEST['url'] ) + switch ( $_REQUEST['repository_cmd'] ) + { + case 'add' : + if ( $_REQUEST['type'] ) + $ret = $composer->repository_add($_REQUEST['type'], $_REQUEST['url']); + break; + + case 'remove' : + $ret = $composer->repository_remove($_REQUEST['url']); + break; + } + + + // user command (not supported by this library) + else if ( $_REQUEST['cmd'] ) + $ret = $composer->command($_REQUEST['cmd']); + } + catch(\Throwable $e) + { + $ret = $e->getMessage() . "\n---\nTrace : " . $e->getTraceAsString(); + } + + if(file_exists($root . '/composer.json')) { + $composer_file_contents = file_get_contents($root . '/composer.json'); + } else { + $composer_file_contents = "No composer.json file detected; you MUST install composer by hitting the SETUP link below.>"; + } + + + $params = [ + 'command_return' => $ret, + 'composer_file_contents' => $composer_file_contents, + 'composer_file_path' => $root.'/composer.json' + ]; + + $this->renderHtml('manage_composer/index.htm', $params); + } +} \ No newline at end of file diff --git a/public/adminer/adminer.php b/public/adminer/adminer.php index 06a2858..c87a22b 100644 --- a/public/adminer/adminer.php +++ b/public/adminer/adminer.php @@ -1,2046 +1,2044 @@ -$W){unset($vg[$y][$he]);if(is_array($W)){$vg[$y][stripslashes($he)]=$W;$vg[]=&$vg[$y][stripslashes($he)];}else$vg[$y][stripslashes($he)]=($Zc?$W:stripslashes($W));}}}}function -bracket_escape($u,$Pa=false){static$xi=array(':'=>':1',']'=>':2','['=>':3','"'=>':4');return -strtr($u,($Pa?array_flip($xi):$xi));}function -min_version($dj,$Ge="",$i=null){global$h;if(!$i)$i=$h;$qh=$i->server_info;if($Ge&&preg_match('~([\d.]+)-MariaDB~',$qh,$A)){$qh=$A[1];$dj=$Ge;}return(version_compare($qh,$dj)>=0);}function -charset($h){return(min_version("5.5.3",0,$h)?"utf8mb4":"utf8");}function -script($Ah,$wi="\n"){return"$Ah$wi";}function -script_src($Qi){return"\n";}function -nonce(){return' nonce="'.get_nonce().'"';}function -target_blank(){return' target="_blank" rel="noreferrer noopener"';}function -h($P){return -str_replace("\0","�",htmlspecialchars($P,ENT_QUOTES,'utf-8'));}function -nl_br($P){return -str_replace("\n","
",$P);}function -checkbox($B,$Y,$gb,$oe="",$xf="",$lb="",$pe=""){$H="".($xf?script("qsl('input').onclick = function () { $xf };",""):"");return($oe!=""||$lb?"$H".h($oe)."":$H);}function -optionlist($Cf,$kh=null,$Vi=false){$H="";foreach($Cf -as$he=>$W){$Df=array($he=>$W);if(is_array($W)){$H.='';$Df=$W;}foreach($Df -as$y=>$X)$H.=''.h($X);if(is_array($W))$H.='';}return$H;}function -html_select($B,$Cf,$Y="",$wf=true,$pe=""){if($wf)return"".(is_string($wf)?script("qsl('select').onchange = function () { $wf };",""):"");$H="";foreach($Cf -as$y=>$X)$H.="";return$H;}function -select_input($Ka,$Cf,$Y="",$wf="",$hg=""){$bi=($Cf?"select":"input");return"<$bi$Ka".($Cf?">