garveen /
laravoole
This project does not seem to handle request data directly as such no vulnerable execution paths were found.
include, or for example
via PHP's auto-loading mechanism.
These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more
| 1 | <?php |
||
| 2 | namespace Laravoole; |
||
| 3 | |||
| 4 | use Exception; |
||
| 5 | use ErrorException; |
||
| 6 | |||
| 7 | use swoole_http_request; |
||
| 8 | |||
| 9 | use Laravoole\Illuminate\Application; |
||
| 10 | use Laravoole\Illuminate\Request as IlluminateRequest; |
||
| 11 | |||
| 12 | use Illuminate\Support\Facades\Facade; |
||
| 13 | use Illuminate\Contracts\Cookie\QueueingFactory as CookieJar; |
||
| 14 | use Psr\Http\Message\ServerRequestInterface; |
||
| 15 | |||
| 16 | use Symfony\Bridge\PsrHttpMessage\Factory\HttpFoundationFactory; |
||
| 17 | use Symfony\Bridge\PsrHttpMessage\Factory\DiactorosFactory; |
||
| 18 | |||
| 19 | abstract class Base |
||
| 20 | { |
||
| 21 | |||
| 22 | protected $root_dir; |
||
| 23 | |||
| 24 | protected $pid_file; |
||
| 25 | |||
| 26 | public $base_config; |
||
| 27 | |||
| 28 | public $handler_config; |
||
| 29 | |||
| 30 | public $wrapper_config; |
||
| 31 | |||
| 32 | protected $kernel; |
||
| 33 | |||
| 34 | protected $tmp_autoloader; |
||
| 35 | |||
| 36 | protected $app; |
||
| 37 | |||
| 38 | protected $server; |
||
| 39 | |||
| 40 | protected $diactorosFactory; |
||
| 41 | |||
| 42 | /** |
||
| 43 | * For wrappers' events. |
||
| 44 | * @var array |
||
| 45 | */ |
||
| 46 | protected $callbacks = []; |
||
| 47 | |||
| 48 | /** |
||
| 49 | * Start the server |
||
| 50 | * @codeCoverageIgnore |
||
| 51 | */ |
||
| 52 | public function start() |
||
| 53 | { |
||
| 54 | throw new Exception(__CLASS__ . "::start MUST be implemented", 1); |
||
| 55 | } |
||
| 56 | |||
| 57 | 20 | final public function init(array $configs) |
|
| 58 | { |
||
| 59 | 20 | $this->pid_file = $configs['pid_file']; |
|
| 60 | 20 | $this->root_dir = $configs['root_dir']; |
|
| 61 | 20 | $this->base_config = $configs['base_config']; |
|
| 62 | 20 | $this->handler_config = $configs['handler_config']; |
|
| 63 | 20 | $this->wrapper_config = $configs['wrapper_config']; |
|
| 64 | 20 | } |
|
| 65 | |||
| 66 | 20 | public function prepareKernel() |
|
| 67 | { |
||
| 68 | // unregister temporary autoloader |
||
| 69 | 20 | foreach (spl_autoload_functions() as $function) { |
|
| 70 | 20 | spl_autoload_unregister($function); |
|
| 71 | 10 | } |
|
| 72 | |||
| 73 | 20 | if (file_exists(__DIR__ . '/../vendor/autoload.php')) { |
|
| 74 | 20 | require __DIR__ . '/../vendor/autoload.php'; |
|
| 75 | 10 | } elseif (file_exists(__DIR__.'/../../../autoload.php')) { |
|
| 76 | require __DIR__ . '/../../../autoload.php'; |
||
| 77 | } elseif (file_exists($this->root_dir . '/bootstrap/autoload.php')) { |
||
| 78 | 20 | //as of laravel>=5.5, optimize command has been deprecated |
|
| 79 | 20 | require $this->root_dir . '/bootstrap/autoload.php'; |
|
| 80 | 20 | } |
|
| 81 | 10 | View Code Duplication | if (isset($this->base_config['callbacks']['bootstraping'])) { |
| 82 | 10 | foreach ($this->base_config['callbacks']['bootstraping'] as $callback) { |
|
| 83 | 20 | $callback($this); |
|
| 84 | } |
||
| 85 | 20 | } |
|
| 86 | 20 | $this->app = $this->getApp(); |
|
| 87 | 10 | ||
| 88 | if (isset($this->wrapper_config['environment_path'])) { |
||
| 89 | 20 | $this->app->useEnvironmentPath($this->wrapper_config['environment_path']); |
|
| 90 | 20 | } |
|
| 91 | |||
| 92 | 20 | $this->kernel = $this->app->make(\Illuminate\Contracts\Http\Kernel::class); |
|
| 93 | 20 | $virus = function () { |
|
| 94 | 20 | // Insert bofore BootProviders |
|
| 95 | 20 | array_splice($this->bootstrappers, -1, 0, [\Illuminate\Foundation\Bootstrap\SetRequestForConsole::class]); |
|
| 96 | }; |
||
| 97 | 20 | $virus = \Closure::bind($virus, $this->kernel, $this->kernel); |
|
| 98 | 20 | $virus(); |
|
| 99 | 20 | ||
| 100 | 20 | $this->kernel->bootstrap(); |
|
| 101 | chdir(public_path()); |
||
| 102 | 20 | $config = $this->app['config']->get('laravoole.base_config', []); |
|
| 103 | 20 | $this->app['config']->set('laravoole.base_config', array_merge($config, $this->base_config)); |
|
| 104 | 20 | ||
| 105 | 10 | View Code Duplication | if (isset($this->base_config['callbacks']['bootstraped'])) { |
| 106 | 10 | foreach ($this->base_config['callbacks']['bootstraped'] as $callback) { |
|
| 107 | 20 | $callback($this); |
|
| 108 | 20 | } |
|
| 109 | } |
||
| 110 | 20 | $this->events = $this->app['events']; |
|
| 111 | } |
||
| 112 | 20 | ||
| 113 | public function handleRequest($request, IlluminateRequest $illuminate_request = null) |
||
| 114 | 20 | { |
|
| 115 | clearstatcache(); |
||
| 116 | |||
| 117 | $kernel = $this->kernel; |
||
| 118 | 20 | ||
| 119 | try { |
||
| 120 | 20 | ||
| 121 | 20 | ob_start(); |
|
| 122 | 8 | ||
| 123 | 8 | if (!$illuminate_request) { |
|
| 124 | 10 | if ($request instanceof ServerRequestInterface) { |
|
| 125 | 8 | $request = (new HttpFoundationFactory)->createRequest($request); |
|
| 126 | 4 | $illuminate_request = IlluminateRequest::createFromBase($request); |
|
| 127 | 11 | } elseif ($request instanceof swoole_http_request) { |
|
| 128 | $illuminate_request = $this->convertRequest($request); |
||
| 129 | 10 | } else { |
|
| 130 | $illuminate_request = IlluminateRequest::createFromBase($request); |
||
| 131 | 20 | } |
|
| 132 | } |
||
| 133 | 20 | ||
| 134 | $this->events->fire('laravoole.requesting', [$illuminate_request]); |
||
| 135 | 20 | ||
| 136 | $illuminate_response = $kernel->handle($illuminate_request); |
||
| 137 | 20 | ||
| 138 | $content = $illuminate_response->getContent(); |
||
| 139 | |||
| 140 | if (strlen($content) === 0 && ob_get_length() > 0) { |
||
| 141 | 20 | $illuminate_response->setContent(ob_get_contents()); |
|
| 142 | } |
||
| 143 | 10 | ||
| 144 | ob_end_clean(); |
||
| 145 | |||
| 146 | } catch (\Exception $e) { |
||
| 147 | echo '[ERR] ' . $e->getFile() . '(' . $e->getLine() . '): ' . $e->getMessage() . PHP_EOL; |
||
| 148 | echo $e->getTraceAsString() . PHP_EOL; |
||
| 149 | 20 | } catch (\Throwable $e) { |
|
| 150 | 20 | echo '[ERR] ' . $e->getFile() . '(' . $e->getLine() . '): ' . $e->getMessage() . PHP_EOL; |
|
| 151 | 20 | echo $e->getTraceAsString() . PHP_EOL; |
|
| 152 | 10 | } finally { |
|
| 153 | 20 | if (isset($illuminate_response)) { |
|
| 154 | $kernel->terminate($illuminate_request, $illuminate_response); |
||
| 155 | 20 | } |
|
| 156 | $this->events->fire('laravoole.requested', [$illuminate_request, $illuminate_response]); |
||
| 157 | |||
| 158 | $this->clean($illuminate_request); |
||
|
0 ignored issues
–
show
|
|||
| 159 | 20 | ||
| 160 | } |
||
| 161 | |||
| 162 | return $illuminate_response; |
||
| 163 | 8 | ||
| 164 | } |
||
| 165 | 8 | ||
| 166 | 8 | public function onPsrRequest(ServerRequestInterface $psrRequest) |
|
| 167 | 8 | { |
|
| 168 | 4 | $illuminate_response = $this->handleRequest($psrRequest); |
|
| 169 | 8 | if (!$this->diactorosFactory) { |
|
| 170 | $this->diactorosFactory = new DiactorosFactory; |
||
| 171 | } |
||
| 172 | return $this->diactorosFactory->createResponse($illuminate_response); |
||
| 173 | 8 | ||
| 174 | } |
||
| 175 | |||
| 176 | 8 | protected function convertRequest($request, $classname = IlluminateRequest::class) |
|
| 177 | 8 | { |
|
| 178 | 8 | ||
| 179 | 8 | $get = isset($request->get) ? $request->get : []; |
|
| 180 | 8 | $post = isset($request->post) ? $request->post : []; |
|
| 181 | 8 | $cookie = isset($request->cookie) ? $request->cookie : []; |
|
| 182 | $server = isset($request->server) ? $request->server : []; |
||
| 183 | $header = isset($request->header) ? $request->header : []; |
||
| 184 | 8 | $files = isset($request->files) ? $request->files : []; |
|
| 185 | // $attr = isset($request->files) ? $request->files : []; |
||
| 186 | 8 | ||
| 187 | $content = $request->rawContent() ?: null; |
||
| 188 | |||
| 189 | 20 | return new $classname($get, $post, []/* attributes */, $cookie, $files, $server, $content); |
|
| 190 | } |
||
| 191 | 20 | ||
| 192 | 20 | protected function clean(IlluminateRequest $request) |
|
| 193 | 20 | { |
|
| 194 | if ($request->hasSession()) { |
||
| 195 | 5 | $session = $request->getSession(); |
|
| 196 | 15 | if (is_callable([$session, 'clear'])) { |
|
| 197 | $session->clear(); // @codeCoverageIgnore |
||
| 198 | 10 | } else { |
|
| 199 | $session->flush(); |
||
| 200 | } |
||
| 201 | 20 | } |
|
| 202 | 20 | ||
| 203 | // Clean laravel cookie queue |
||
| 204 | 10 | $cookies = $this->app->make(CookieJar::class); |
|
| 205 | foreach ($cookies->getQueuedCookies() as $name => $cookie) { |
||
| 206 | 20 | $cookies->unqueue($name); |
|
| 207 | 20 | } |
|
| 208 | 20 | ||
| 209 | 10 | if ($this->app->isProviderLoaded(\Illuminate\Auth\AuthServiceProvider::class)) { |
|
| 210 | 20 | $this->app->register(\Illuminate\Auth\AuthServiceProvider::class, [], true); |
|
| 211 | Facade::clearResolvedInstance('auth'); |
||
| 212 | 20 | } |
|
| 213 | } |
||
| 214 | 20 | ||
| 215 | 20 | public function getApp() |
|
| 216 | 10 | { |
|
| 217 | 20 | if (!$this->app) { |
|
| 218 | $this->app = $this->createApp(); |
||
| 219 | } |
||
| 220 | 20 | return $this->app; |
|
| 221 | } |
||
| 222 | 20 | ||
| 223 | 20 | protected function createApp() |
|
| 224 | 20 | { |
|
| 225 | $app = new Application($this->root_dir); |
||
| 226 | 20 | $rootNamespace = $app->getNamespace(); |
|
| 227 | 20 | $rootNamespace = trim($rootNamespace, '\\'); |
|
| 228 | 20 | ||
| 229 | 10 | $app->singleton( |
|
| 230 | \Illuminate\Contracts\Http\Kernel::class, |
||
| 231 | 20 | "\\{$rootNamespace}\\Http\\Kernel" |
|
| 232 | 20 | ); |
|
| 233 | 20 | ||
| 234 | 10 | $app->singleton( |
|
| 235 | \Illuminate\Contracts\Console\Kernel::class, |
||
| 236 | 20 | "\\{$rootNamespace}\\Console\\Kernel" |
|
| 237 | 20 | ); |
|
| 238 | 20 | ||
| 239 | 10 | $app->singleton( |
|
| 240 | \Illuminate\Contracts\Debug\ExceptionHandler::class, |
||
| 241 | 20 | "\\{$rootNamespace}\\Exceptions\\Handler" |
|
| 242 | ); |
||
| 243 | |||
| 244 | return $app; |
||
| 245 | } |
||
| 246 | |||
| 247 | } |
||
| 248 |
It seems like the type of the argument is not accepted by the function/method which you are calling.
In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug.
We suggest to add an explicit type cast like in the following example: