From 666c54e1e1068d10bced7e79b386d20b04ca36d5 Mon Sep 17 00:00:00 2001 From: Mali Oz Date: Thu, 16 May 2024 13:30:26 -0300 Subject: [PATCH 1/6] indent --- app/Http/Controllers/ExercicioController.php | 551 +++++++++--------- .../Controllers/ImpedimentoController.php | 42 +- 2 files changed, 304 insertions(+), 289 deletions(-) diff --git a/app/Http/Controllers/ExercicioController.php b/app/Http/Controllers/ExercicioController.php index 2fbfed7..9a90378 100644 --- a/app/Http/Controllers/ExercicioController.php +++ b/app/Http/Controllers/ExercicioController.php @@ -30,13 +30,13 @@ class ExercicioController extends Controller */ public function index() { - $exercicios = Exercicio::orderBy('name'); - /** @var App\Models\User */ - $user = Auth::user(); - if(!$user || !$user->isAdmin()) { + $exercicios = Exercicio::orderBy('name'); + /** @var \App\Models\User */ + $user = Auth::user(); + if (!$user || !$user->isAdmin()) { $exercicios = $exercicios->published(); } - return View('exercicio.index')->with('exercicios',$exercicios->get()); + return View('exercicio.index')->with('exercicios', $exercicios->get()); } /** @@ -47,8 +47,8 @@ public function index() public function create() { $this->authorize('create', Exercicio::class); - return View('exercicio.create')->with('pacotesR',$this->getInstalledPackages()); - } + return View('exercicio.create')->with('pacotesR', $this->getInstalledPackages()); + } /** * Store a newly created resource in storage. @@ -56,15 +56,16 @@ public function create() * @param \Illuminate\Http\Request $request * @return mixed */ - private function validateExercicio (Request $request, Exercicio|Null $exercicio) { + private function validateExercicio(Request $request, Exercicio|null $exercicio) + { $rules = array( - 'name' => 'required|string|unique:exercicios'.($exercicio ? ',name,'.$exercicio->id : ''), - 'description'=> 'required', - 'precondicoes'=>'sometimes', - 'dicas' => 'array', + 'name' => 'required|string|unique:exercicios' . ($exercicio ? ',name,' . $exercicio->id : ''), + 'description' => 'required', + 'precondicoes' => 'sometimes', + 'dicas' => 'array', 'condicoes' => 'array', 'pesos' => 'array', - 'dicas.*' => 'required', + 'dicas.*' => 'required', 'condicoes.*' => 'required', 'pesos.*' => 'required|numeric|min:0', 'draft' => 'required|boolean', @@ -72,116 +73,121 @@ private function validateExercicio (Request $request, Exercicio|Null $exercicio) $data = $request->validate($rules); // corrigir EOL - $data['precondicoes'] = str_replace("\r\n","\n",$data['precondicoes']); - $data['description'] = str_replace("\r\n","\n",$data['description']); + $data['precondicoes'] = str_replace("\r\n", "\n", $data['precondicoes']); + $data['description'] = str_replace("\r\n", "\n", $data['description']); - return $data; - } + return $data; + } /** * Store a newly created resource in storage. * * @param \Illuminate\Http\Request $request - * @return \Illuminate\Http\Response + * @return \Illuminate\Http\RedirectResponse */ public function store(Request $request) { - $this->authorize('create', Exercicio::class); + $this->authorize('create', Exercicio::class); - $data = $this->validateExercicio($request, null); + $data = $this->validateExercicio($request, null); // store $exercicio = new Exercicio($data); - DB::transaction(function() use ($data, $exercicio) { + DB::transaction(function () use ($data, $exercicio) { $exercicio->save(); $n = count($data['dicas']); for ($i = 0; $i < $n; $i++) { - Teste::create(['condicao' => $data['condicoes'][$i], - 'dica' => $data['dicas'][$i], - 'peso' => $data['pesos'][$i], - 'exercicio_id' => $exercicio->id - ]); + Teste::create([ + 'condicao' => $data['condicoes'][$i], + 'dica' => $data['dicas'][$i], + 'peso' => $data['pesos'][$i], + 'exercicio_id' => $exercicio->id + ]); } - }); + }); - $test = $this->corretoR($exercicio, "/usr/local/src/notar/runtest.R"); - if ($test['status']=='danger') { - return redirect()->action([ExercicioController::class,'edit'],['exercicio' => $exercicio]) - ->withErrors(['precondicoes' => 'Ocorreu um erro ao testar as precondições.']); - } + $test = $this->corretoR($exercicio, "/usr/local/src/notar/runtest.R"); + if ($test['status'] == 'danger') { + return redirect()->action( + [ExercicioController::class, 'edit'], + ['exercicio' => $exercicio] + )->withErrors( + ['precondicoes' => 'Ocorreu um erro ao testar as precondições.'] + ); + } - return redirect()->action([ExercicioController::class,'show'],['exercicio' => $exercicio]); + return redirect()->action([ExercicioController::class, 'show'], ['exercicio' => $exercicio]); } /** * Show the profile of a given Exercicio. * - * @param \App\Models\Exercicio $exercicio + * @param \App\Models\Exercicio $exercicio * @return \Illuminate\View\View */ public function show(Exercicio $exercicio) { $this->authorize('view', $exercicio); - $prazo = Auth::user() ? Auth::user()->prazo($exercicio) : false; + $prazo = Auth::user() ? Auth::user()->prazo($exercicio) : false; - return View('exercicio.show')->with('exercicio',$exercicio) - ->with('foraDoPrazo', $prazo ? $prazo->prazo <= now() : false); + return View('exercicio.show')->with('exercicio', $exercicio) + ->with('foraDoPrazo', $prazo ? $prazo->prazo <= now() : false); } /** * Retorna uma lista de pacotes instalados no ambiente R * - * @return Array + * @return array | null */ - private function getInstalledPackages () { - try { - $cnx = new Connection('r'); - - $rcode = 'pkgs <- installed.packages();' - . 'pkgs[,1];' - ; - // resposta do R - $r = $cnx->evalString($rcode); - - return ($r); - } - catch (Exception $e) { - Log::error('Erro de conexão em getInstalledPackages'); - return null; - } + private function getInstalledPackages() + { + try { + $cnx = new Connection('r'); + + $rcode = 'pkgs <- installed.packages();' + . 'pkgs[,1];' + ; + // resposta do R + $r = $cnx->evalString($rcode); + + return ($r); + } catch (Exception $e) { + Log::error('Erro de conexão em getInstalledPackages'); + return null; + } } /** * Roda o corretoR usando o código * * @param Exercicio $exercicio - * @param string $codigo - * @return Array + * @param string $codigo + * @return array */ - private function corretoR (Exercicio $exercicio, string $file) { + private function corretoR(Exercicio $exercicio, string $file) + { // resposta do R try { $cnx = new Connection('r'); $rcode = 'source("/usr/local/src/notar/corretor.R");' - // database auth - . 'dbusr <- "'. env('DB_USERNAME') . '";' - . 'dbpass <- "'. env('DB_PASSWORD') . '";' - . 'dbname <- "'. env('DB_DATABASE') . '";' - . 'con <- connect(dbusr, dbpass, dbname);' - // import files - . 'file.copy(list.files("/arquivos/",recursive=TRUE,full.names=TRUE),".");' - // run corretoR - . 'res <- notaR('. $exercicio->id .',"'.$file.'");' - . 'unlink("*",recursive=TRUE);' - . 'res;' - ; + // database auth + . 'dbusr <- "' . env('DB_USERNAME') . '";' + . 'dbpass <- "' . env('DB_PASSWORD') . '";' + . 'dbname <- "' . env('DB_DATABASE') . '";' + . 'con <- connect(dbusr, dbpass, dbname);' + // import files + . 'file.copy(list.files("/arquivos/",recursive=TRUE,full.names=TRUE),".");' + // run corretoR + . 'res <- notaR(' . $exercicio->id . ',"' . $file . '");' + . 'unlink("*",recursive=TRUE);' + . 'res;' + ; $r = $cnx->evalString($rcode); - } - catch (RserveException $e){ + } catch (RserveException $e) { return [ 'status' => 'danger', - 'mensagem' => 'Ocorreu um erro na correção do exercício! Por favor verifique seu código ou contate um administrador.' , + 'mensagem' => 'Ocorreu um erro na correção do exercício! Por favor verifique seu código ou contate um administrador.', 'resultado' => null, 'nota' => 0 ]; @@ -191,23 +197,23 @@ private function corretoR (Exercicio $exercicio, string $file) { if ($r === null) { return [ 'status' => 'danger', - 'mensagem' => 'Ocorreu um erro na execução do seu código! Corrija e tente novamente.' , + 'mensagem' => 'Ocorreu um erro na execução do seu código! Corrija e tente novamente.', 'resultado' => $r, 'nota' => 0 ]; } // garantee that $r is an array ffs - if(is_bool($r)) { + if (is_bool($r)) { $r = [$r]; } // 100% - if(in_array(false, $r, true) === false) { + if (in_array(false, $r, true) === false) { return [ 'status' => 'success', 'mensagem' => 'Parabéns! Seu código passou em todos os testes!
' - . 'Toca aqui!', + . 'Toca aqui!', 'resultado' => $r, 'nota' => 100 ]; @@ -218,17 +224,16 @@ private function corretoR (Exercicio $exercicio, string $file) { // calcula nota $nota = 0; $firstmistake = -1; - for($i = 0; $ipeso; - } - else if ($firstmistake == -1) { + } else if ($firstmistake == -1) { $firstmistake = $i; } } $dica = $testes[$firstmistake]->dica; $notamax = $testes->sum('peso'); - $notanormalizada = 100*$nota/$notamax; + $notanormalizada = 100 * $nota / $notamax; return [ 'status' => 'warning', @@ -243,7 +248,7 @@ private function corretoR (Exercicio $exercicio, string $file) { * Ação de fazer exercício usando o form * * @param \Illuminate\Http\Request $request - * @param \App\Models\Exercicio $exercicio + * @param \App\Models\Exercicio $exercicio * @return \Illuminate\View\View */ public function submit(Request $request, Exercicio $exercicio) @@ -253,15 +258,15 @@ public function submit(Request $request, Exercicio $exercicio) ); $data = $request->validate($rules); - $validator = Validator::make($request->all(), $rules); - return $this->recebeCodigo($data['codigo'], $exercicio, $validator); - } + $validator = Validator::make($request->all(), $rules); + return $this->recebeCodigo($data['codigo'], $exercicio, $validator); + } /** * Ação de fazer exercício usando file upload * * @param \Illuminate\Http\Request $request - * @param \App\Models\Exercicio $exercicio + * @param \App\Models\Exercicio $exercicio * @return \Illuminate\View\View */ public function upload(Request $request, Exercicio $exercicio) @@ -273,259 +278,269 @@ public function upload(Request $request, Exercicio $exercicio) $validator = Validator::make($request->all(), $rules); - $codigo = $request->file('file')->get(); - // convert to - $codigo = Encoding::toUTF8($codigo); - return $this->recebeCodigo($codigo, $exercicio, $validator); + $codigo = $request->file('file')->get(); + // convert to + $codigo = Encoding::toUTF8($codigo); + return $this->recebeCodigo($codigo, $exercicio, $validator); } - private function recebeCodigo (String $codigo, Exercicio $exercicio, \Illuminate\Contracts\Validation\Validator $validator) { + private function recebeCodigo(string $codigo, Exercicio $exercicio, \Illuminate\Contracts\Validation\Validator $validator) + { - $user = Auth::user(); - if($user) { - Log::info('User '.$user->id.' submitted an answer to exercise '.$exercicio->id); - } - else { - Log::info('Guest submitted an answer to exercise '.$exercicio->id); - } + $user = Auth::user(); + if ($user) { + Log::info('User ' . $user->id . ' submitted an answer to exercise ' . $exercicio->id); + } else { + Log::info('Guest submitted an answer to exercise ' . $exercicio->id); + } - $validator->after(function ($validator) use($codigo) { - foreach(Impedimento::all()->pluck('palavra') as $palavra) { - if (Str::contains($codigo,$palavra)) { + $validator->after(function ($validator) use ($codigo) { + foreach (Impedimento::all()->pluck('palavra') as $palavra) { + if (Str::contains($codigo, $palavra)) { $validator->errors()->add( - 'codigo', 'Código não pode conter a palavra: '.$palavra + 'codigo', + 'Código não pode conter a palavra: ' . $palavra ); } } }); - if ($validator->fails()) { - return redirect(URL::to('exercicio/'.$exercicio->id)) - ->withErrors($validator) - ->withInput(); - } + if ($validator->fails()) { + return redirect(URL::to('exercicio/' . $exercicio->id)) + ->withErrors($validator) + ->withInput(); + } // corrigir EOL - $codigo = str_replace("\r\n","\n",$codigo); + $codigo = str_replace("\r\n", "\n", $codigo); // salva um arquivo com o codigo $tempfile = TmpFile::generateTmpFileName(md5($codigo), '.R'); Storage::put($tempfile, $codigo); // corrige - $respostaR = $this->corretoR($exercicio,$tempfile); + $respostaR = $this->corretoR($exercicio, $tempfile); // deleta arquivo temporário Storage::delete($tempfile); // salvar nota no banco de dados - if($user && !$exercicio->draft) { + if ($user && !$exercicio->draft) { $exercicio->notas()->create([ 'nota' => $respostaR['nota'], 'user_id' => $user->id, 'testes' => $respostaR['resultado'], 'codigo' => $codigo ]); - } + } - $prazo = $user ? $user->prazo($exercicio) : false; + $prazo = $user ? $user->prazo($exercicio) : false; return View('exercicio.show')->with('exercicio', $exercicio) - ->with('foraDoPrazo', $prazo ? $prazo->prazo <= now() : false) - ->with('respostaR', $respostaR) - ->with('codigo', $codigo); + ->with('foraDoPrazo', $prazo ? $prazo->prazo <= now() : false) + ->with('respostaR', $respostaR) + ->with('codigo', $codigo); } /** * Show the form for editing the specified resource. * - * @param \App\Models\Exercicio $exercicio + * @param \App\Models\Exercicio $exercicio * @return \Illuminate\Http\Response */ public function edit(Exercicio $exercicio) { $this->authorize('edit', $exercicio); - return View('exercicio.edit')->with('exercicio',$exercicio)->with('exercicio.testes',$exercicio->testes)->with('pacotesR',$this->getInstalledPackages()); + return View('exercicio.edit')->with('exercicio', $exercicio)->with('exercicio.testes', $exercicio->testes)->with('pacotesR', $this->getInstalledPackages()); } - /** - * Update the specified resource in storage. - * - * @param \Illuminate\Http\Request $request - * @param \App\Models\Exercicio $exercicio - * @return \Illuminate\Http\Response - */ - public function update(Request $request, Exercicio $exercicio) - { - $this->authorize('edit',$exercicio); - $data = $this->validateExercicio($request, $exercicio); + /** + * Update the specified resource in storage. + * + * @param \Illuminate\Http\Request $request + * @param \App\Models\Exercicio $exercicio + * @return \Illuminate\Http\RedirectResponse + */ + public function update(Request $request, Exercicio $exercicio) + { + $this->authorize('edit', $exercicio); + $data = $this->validateExercicio($request, $exercicio); // store - DB::transaction(function() use ($data, $exercicio) { + DB::transaction(function () use ($data, $exercicio) { $exercicio->update($data); $exercicio->testes()->delete(); // delete all testes because we're lazy $n = count($data['dicas']); for ($i = 0; $i < $n; $i++) { - $teste = Teste::create(['condicao' => $data['condicoes'][$i], - 'dica' => $data['dicas'][$i], - 'peso' => $data['pesos'][$i], - 'exercicio_id' => $exercicio->id - ]); + $teste = Teste::create([ + 'condicao' => $data['condicoes'][$i], + 'dica' => $data['dicas'][$i], + 'peso' => $data['pesos'][$i], + 'exercicio_id' => $exercicio->id + ]); } }); - // testa as preconds - $test = $this->corretoR($exercicio, "/usr/local/src/notar/runtest.R"); - if ($test['status']=='danger') { - return redirect()->action([ExercicioController::class,'edit'],['exercicio' => $exercicio]) - ->withErrors(['precondicoes' => 'Ocorreu um erro ao testar as precondições.']); - } + // testa as preconds + $test = $this->corretoR($exercicio, "/usr/local/src/notar/runtest.R"); + if ($test['status'] == 'danger') { + return redirect()->action( + [ExercicioController::class, 'edit'], + ['exercicio' => $exercicio] + )->withErrors( + ['precondicoes' => 'Ocorreu um erro ao testar as precondições.'] + ); + } - return redirect()->action([ExercicioController::class,'show'],['exercicio' => $exercicio]); - } + return redirect()->action( + [ExercicioController::class, 'show'], + ['exercicio' => $exercicio] + ); + } /** * Export to text file * - * @param int $id + * @param int $id * @return \Illuminate\Http\Response */ public function export(int $id) { - $exercicio = Exercicio::with('testes')->find($id); - $this->authorize('edit', $exercicio); - - try - { - $filename = TmpFile::generateTmpFileName('notaR_exercicio'.$exercicio->name,'.yaml'); - Storage::put($filename, $exercicio->export()); - } - catch (Exception $e) - { - return back()->withErrors('Erro ao exportar exercício.'); - }; + $exercicio = Exercicio::with('testes')->find($id); + $this->authorize('edit', $exercicio); + + try { + $filename = TmpFile::generateTmpFileName('notaR_exercicio' . $exercicio->name, '.yaml'); + Storage::put($filename, $exercicio->export()); + } catch (Exception $e) { + return back()->withErrors('Erro ao exportar exercício.'); + } + ; + return response()->download($filename)->deleteFileAfterSend(true); + } + + /** Export all exercicios + * + * @return \Illuminate\Http\Response + */ + public function exportAll() + { + $this->authorize('bulk', Exercicio::class); + + // Create files for each model + // Create a file containing all of that + $exercicios = Exercicio::with('testes')->get(); + $filename = TmpFile::generateTmpFileName('notaR_exercicios', '.zip'); + + try { + $zip = new ZipArchive; + if ($zip->open($filename, ZipArchive::CREATE) === TRUE) { + foreach ($exercicios as $key => $value) { + $fn = Str::slug($value->name) . '.yaml'; + $zip->addFromString($fn, $value->export()); + } + $zip->close(); + } + } catch (Exception $e) { + return back()->withErrors('Erro ao exportar exercícios.'); + } + ; return response()->download($filename)->deleteFileAfterSend(true); - } - - /** Export all exercicios - * - * @return \Illuminate\Http\Response - */ - public function exportAll () - { - $this->authorize('bulk', Exercicio::class); - - // Create files for each model - // Create a file containing all of that - $exercicios = Exercicio::with('testes')->get(); - $filename = TmpFile::generateTmpFileName('notaR_exercicios','.zip'); - - try - { - $zip = new ZipArchive; - if ($zip->open($filename, ZipArchive::CREATE) === TRUE) { - foreach ($exercicios as $key => $value) { - $fn = Str::slug($value->name).'.yaml'; - $zip->addFromString($fn, $value->export()); - } - $zip->close(); - } - } - catch (Exception $e) - { - return back()->withErrors('Erro ao exportar exercícios.'); - }; - return response()->download($filename)->deleteFileAfterSend(true); - } - - private function importInput ($data) { - $input = ['from_import' => true]; - if (property_exists($data,'testes')) { - $testes = collect($data->testes); - $input = [ - 'dicas' => $testes->pluck('dica'), - 'condicoes' => $testes->pluck('condicao'), - 'pesos' => $testes->pluck('peso'), - 'from_import' => true - ]; - } - - if (property_exists($data, 'name')) { - $input['name'] = $data->name; - } - - if (property_exists($data, 'description')) { - $input['description'] = $data->description; - } - - if (property_exists($data, 'precondicoes')) { - $input['precondicoes'] = $data->precondicoes; - } - - return $input; - } + } + + private function importInput($data) + { + $input = ['from_import' => true]; + if (property_exists($data, 'testes')) { + $testes = collect($data->testes); + $input = [ + 'dicas' => $testes->pluck('dica'), + 'condicoes' => $testes->pluck('condicao'), + 'pesos' => $testes->pluck('peso'), + 'from_import' => true + ]; + } + + if (property_exists($data, 'name')) { + $input['name'] = $data->name; + } + + if (property_exists($data, 'description')) { + $input['description'] = $data->description; + } + + if (property_exists($data, 'precondicoes')) { + $input['precondicoes'] = $data->precondicoes; + } + + return $input; + } /** * Import from yaml file * - * @param \Illuminate\Http\Request $request - * @param \App\Models\Exercicio $exercicio - * @return \Illuminate\Http\Response - */ - public function importEdit (Request $request, Exercicio $exercicio) + * @param \Illuminate\Http\Request $request + * @param \App\Models\Exercicio $exercicio + * @return \Illuminate\Http\RedirectResponse + */ + public function importEdit(Request $request, Exercicio $exercicio) { - $this->authorize('edit', $exercicio); - $request->validate([ - 'file' => 'required', - ]); + $this->authorize('edit', $exercicio); + $request->validate([ + 'file' => 'required', + ]); + + $j = $request->file('file')->get(); + + $data = Yaml::parse($j); + if (is_null($data)) { + return redirect()->action( + [ExercicioController::class, 'edit'], + ['exercicio' => $exercicio] + )->withErrors(['file' => 'O arquivo enviado não é um json válido']); + } - $j = $request->file('file')->get(); + return redirect()->action( + [ExercicioController::class, 'edit'], + ['exercicio' => $exercicio] + )->withInput($this->importInput((object) $data)); + } - $data = Yaml::parse($j); - if( is_null($data)) { - return redirect()->action([ExercicioController::class,'edit'],['exercicio' => $exercicio]) - ->withErrors(['file' => 'O arquivo enviado não é um json válido']); - } - return redirect()->action([ExercicioController::class,'edit'],['exercicio' => $exercicio]) - ->withInput($this->importInput((object)$data)); - } + /** + * Import from json file + * + * @param \Illuminate\Http\Request $request + * @return \Illuminate\Http\RedirectResponse + */ + public function import(Request $request) + { + $this->authorize('create', Exercicio::class); + $request->validate([ + 'file' => 'required', + ]); + + $j = $request->file('file')->get(); + + $data = Yaml::parse($j); + if (is_null($data)) { + return redirect()->action([ExercicioController::class, 'create']) + ->withErrors(['file' => 'O arquivo enviado não é um yaml válido']); + } + + return redirect()->action([ExercicioController::class, 'create']) + ->withInput($this->importInput((object) $data)); + } /** - * Import from json file + * Remove the specified resource from storage. * - * @param \Illuminate\Http\Request $request - * @return \Illuminate\Http\Response - */ - public function import (Request $request) + * @param \App\Models\Exercicio $exercicio + * @return \Illuminate\Http\Response + */ + public function destroy(Exercicio $exercicio) { - $this->authorize('create', Exercicio::class ); - $request->validate([ - 'file' => 'required', - ]); - - $j = $request->file('file')->get(); - - $data = Yaml::parse($j); - if( is_null($data)) { - return redirect()->action([ExercicioController::class,'create']) - ->withErrors(['file' => 'O arquivo enviado não é um yaml válido']); - } - - return redirect()->action([ExercicioController::class,'create']) - ->withInput($this->importInput((object) $data)); - } - - - /** - * Remove the specified resource from storage. - * - * @param \App\Models\Exercicio $exercicio - * @return \Illuminate\Http\Response - */ - public function destroy(Exercicio $exercicio) - { - $this->authorize('delete', $exercicio); - $exercicio->testes()->delete(); - $exercicio->delete(); - return redirect()->action([ExercicioController::class,'index']); - } + $this->authorize('delete', $exercicio); + $exercicio->testes()->delete(); + $exercicio->delete(); + return redirect()->action([ExercicioController::class, 'index']); + } } diff --git a/app/Http/Controllers/ImpedimentoController.php b/app/Http/Controllers/ImpedimentoController.php index ed71b7c..7b16485 100644 --- a/app/Http/Controllers/ImpedimentoController.php +++ b/app/Http/Controllers/ImpedimentoController.php @@ -8,15 +8,15 @@ class ImpedimentoController extends Controller { - /** - * List impedimentos. - * - * @return \Illuminate\Http\Response - */ - public function index() - { + /** + * List impedimentos. + * + * @return \Illuminate\Http\Response + */ + public function index() + { $this->authorize('view', Impedimento::class); - return View('impedimento.index')->with('impedimentos',Impedimento::all()); + return View('impedimento.index')->with('impedimentos', Impedimento::all()); } /** @@ -40,66 +40,66 @@ public function store(Request $request) { $this->authorize('create', Impedimento::class); $rules = array( - 'palavra' => 'required|string', + 'palavra' => 'required|string', ); $data = $request->validate($rules); // store $impedimento = tap(new Impedimento($data))->save(); - return redirect()->action([ImpedimentoController::class,'index']); + return redirect()->action([ImpedimentoController::class, 'index']); } /** * Show the profile of a given Impedimento. * - * @param App\Models\Impedimento $impedimento + * @param \App\Models\Impedimento $impedimento * @return \Illuminate\View\View */ public function show(Impedimento $impedimento) { - return redirect()->action([ImpedimentoController::class,'index']); + return redirect()->action([ImpedimentoController::class, 'index']); } /** * Show the form for editing the specified resource. * - * @param App\Models\Impedimento $impedimento + * @param \App\Models\Impedimento $impedimento * @return \Illuminate\Http\Response */ public function edit(Impedimento $impedimento) { $this->authorize('edit', $impedimento); - return View('impedimento.edit')->with('impedimento',$impedimento); + return View('impedimento.edit')->with('impedimento', $impedimento); } /** * Update the specified resource in storage. * * @param \Illuminate\Http\Request $request - * @param App\Models\Impedimento $impedimento + * @param \App\Models\Impedimento $impedimento * @return \Illuminate\Http\Response */ public function update(Request $request, Impedimento $impedimento) { $this->authorize('edit', $impedimento); $rules = array( - 'palavra' => 'required|string', + 'palavra' => 'required|string', ); $data = $request->validate($rules); - $impedimento->update($data); - return redirect()->action([get_class($this),'index']); + $impedimento->update($data); + return redirect()->action([get_class($this), 'index']); } /** * Remove the specified resource from storage. * - * @param App\Models\Impedimento $impedimento + * @param \App\Models\Impedimento $impedimento * @return \Illuminate\Http\Response */ public function destroy(Impedimento $impedimento) { $this->authorize('delete', $impedimento); - $impedimento->delete(); - return redirect()->action([get_class($this),'index']); + $impedimento->delete(); + return redirect()->action([get_class($this), 'index']); } } From f44da5b03f7eb218fb70427f6c290b31a0a98891 Mon Sep 17 00:00:00 2001 From: Mali Oz Date: Thu, 16 May 2024 13:45:30 -0300 Subject: [PATCH 2/6] fix missing EOL warning --- app/Http/Controllers/ExercicioController.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Http/Controllers/ExercicioController.php b/app/Http/Controllers/ExercicioController.php index 9a90378..6bf6841 100644 --- a/app/Http/Controllers/ExercicioController.php +++ b/app/Http/Controllers/ExercicioController.php @@ -311,7 +311,7 @@ private function recebeCodigo(string $codigo, Exercicio $exercicio, \Illuminate\ } // corrigir EOL - $codigo = str_replace("\r\n", "\n", $codigo); + $codigo = str_replace("\r\n", PHP_EOL, $codigo).PHP_EOL; // salva um arquivo com o codigo $tempfile = TmpFile::generateTmpFileName(md5($codigo), '.R'); From f7acfb44b90816d7f2d4225d00372071e95be9fd Mon Sep 17 00:00:00 2001 From: Mali Oz Date: Thu, 16 May 2024 14:45:50 -0300 Subject: [PATCH 3/6] update to R 4.4.0 (security fix) --- docker/R/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker/R/Dockerfile b/docker/R/Dockerfile index d15e4c5..b991070 100644 --- a/docker/R/Dockerfile +++ b/docker/R/Dockerfile @@ -1,5 +1,5 @@ # Using a fixed version R to ensure consistency -FROM r-base:4.3.2 +FROM r-base:4.4.0 # Install system dependencies RUN apt-get update --fix-missing \ && apt-get install -y --no-install-recommends \ From be009aee6061c011601da3889dd7dfdfcd1d2441 Mon Sep 17 00:00:00 2001 From: Mali Oz Date: Thu, 16 May 2024 14:46:28 -0300 Subject: [PATCH 4/6] Fix #110 --- docker/R/corretor.R | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/docker/R/corretor.R b/docker/R/corretor.R index 6ac6f94..0947b46 100644 --- a/docker/R/corretor.R +++ b/docker/R/corretor.R @@ -7,7 +7,7 @@ connect <- function (dbuser, dbpass, dbname) { con<- dbConnect(MySQL(), user=dbuser, password=dbpass, dbname=dbname, host='mysql') return (con); } -# Construida na chamada PHP como +# Construida na chamada PHP como # con <- connect($DBUSER, $DBPASS, $DBNAME) # Funcao acessoria para testar se um objeto MySQL nao tem resultados @@ -15,8 +15,8 @@ no.results <- function(object) { length(object[,1]) == 0 } -# corretoR recebe: -# texto +# corretoR recebe: +# texto # E devolve um um vector logico com o resultado dos testes # Caso o codigo tenha erros de sintaxe, retorna NULL corretoR <- function (id.exerc, texto) { @@ -29,14 +29,16 @@ corretoR <- function (id.exerc, texto) { paste("SELECT condicao FROM testes WHERE exercicio_id=", id.exerc, " ORDER BY id ASC", sep="")); - precondi <- dbGetQuery(con, - paste("SELECT precondicoes FROM exercicios + precondi <- dbGetQuery(con, + paste("SELECT precondicoes FROM exercicios WHERE id=", id.exerc, sep="")); # Executa as precondicoes if(!no.results(precondi)) eval(parse(text=precondi), envir=corrEnv); # Executa o texto da resposta + # Evita que o codigo retorne matrizes + texto <- paste0(texto,";TRUE;"); # try pega erros de sintaxe getError <- try(eval(parse(text=texto), envir=corrEnv)); if (class(getError) == "try-error") return (NULL); @@ -47,7 +49,7 @@ corretoR <- function (id.exerc, texto) { for (i in 1:notaMax) { # A avaliacao pode retornar TRUE, FALSE ou erro # No momento, erro esta sendo tratado como FALSE - # Edit fev 2013: + # Edit fev 2013: # O [1] no final tem a funcao de evitar condicoes com comprimento 0. # Agora essas condicoes se tornam [1] NA, que serao transformados em FALSE abaixo notas[i] <- (try(eval(parse(text=testes[i,1]), envir=corrEnv))[1] == TRUE)[1]; @@ -68,7 +70,7 @@ notaR <- function (id.exerc, arquivo) { return (nota); } -# Exemplos: +# Exemplos: # con <- connect('notaR', 'notaRPW', 'notaR') # corretoR(1, "y<-1;x<-2") # ou From a4e8d1c3e6b50ed92d7821c552f561059d1c5601 Mon Sep 17 00:00:00 2001 From: Mali Oz Date: Thu, 16 May 2024 14:47:11 -0300 Subject: [PATCH 5/6] script to test memory use limit --- storage/app/public/examples/breaking.R | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 storage/app/public/examples/breaking.R diff --git a/storage/app/public/examples/breaking.R b/storage/app/public/examples/breaking.R new file mode 100644 index 0000000..6d91790 --- /dev/null +++ b/storage/app/public/examples/breaking.R @@ -0,0 +1,5 @@ +# This should overwhelm any system + +m <- matrix(1:1000,nrow=1) +while(TRUE) + m <- rbind(m,m) From e860c45bd145f98fed8b524d150824997d904a0a Mon Sep 17 00:00:00 2001 From: Mali Oz Date: Thu, 16 May 2024 15:05:30 -0300 Subject: [PATCH 6/6] actally fix #110 --- docker/R/corretor.R | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/docker/R/corretor.R b/docker/R/corretor.R index 0947b46..40eea4e 100644 --- a/docker/R/corretor.R +++ b/docker/R/corretor.R @@ -37,10 +37,11 @@ corretoR <- function (id.exerc, texto) { if(!no.results(precondi)) eval(parse(text=precondi), envir=corrEnv); # Executa o texto da resposta - # Evita que o codigo retorne matrizes - texto <- paste0(texto,";TRUE;"); + getError <- try(eval( + c(parse(text=texto),"TRUE"), # Evita que o codigo retorne matrizes + envir=corrEnv + )); # try pega erros de sintaxe - getError <- try(eval(parse(text=texto), envir=corrEnv)); if (class(getError) == "try-error") return (NULL); # Executa os testes cadastrados, sequencialmente