Compare commits

..

29 Commits

Author SHA1 Message Date
Dave Mc Nicoll
81e124b144 - Added getenvonce 2026-06-01 15:23:49 +00:00
Dave Mc Nicoll
9cd6f10d7e - Merged with master done 2026-06-01 15:23:48 +00:00
Dave Mc Nicoll
a36dbeeef2 - Fixed conflicts 2026-06-01 15:23:42 +00:00
7ed88ec89f - Added createStream methods and fixed multiple errors views 2026-06-01 15:23:11 +00:00
c6e9bb6a38 - Added MethodNotAllowed interface 2026-06-01 15:23:04 +00:00
Dave Mc Nicoll
e934c1a92c -Rebasing 2026-06-01 15:23:04 +00:00
baf6fdf952 - Added createStream methods and fixed multiple errors views 2026-06-01 15:23:03 +00:00
Dave Mc Nicoll
e0da7ae734 - Merged with master done 2026-06-01 15:22:54 +00:00
Dave Mc Nicoll
64f273e65c - Rebased 2026-06-01 15:22:54 +00:00
Dave Mc Nicoll
9031236930 - WIP on ulmus-user mechanics updates 2026-06-01 15:22:54 +00:00
7ee4b2d8bb - Added createStream methods and fixed multiple errors views 2026-06-01 15:22:38 +00:00
06c4f46486 - Added MethodNotAllowed interface 2026-06-01 15:21:56 +00:00
Dave Mc Nicoll
01d48463b3 - Merged with master done 2026-05-21 15:18:50 +00:00
Dave Mc Nicoll
abe94e498f - Fixed conflicts 2026-05-21 15:18:49 +00:00
Dev
adfd619c5f - Fixed default view order to 1000 2026-05-21 15:18:04 +00:00
16ee06593c - Added createStream methods and fixed multiple errors views 2026-05-21 15:18:03 +00:00
5bb5e8ce61 - Added MethodNotAllowed interface 2026-05-21 15:16:58 +00:00
Dave Mc Nicoll
fda052d2f3 - Redefined view order 2026-03-03 16:34:41 +00:00
Dave Mc Nicoll
dac7acde87 - Fixed email route argument pattern and added getenvonce() method 2026-02-25 19:43:36 +00:00
Dave Mc Nicoll
b16b4803c5 -Rebasing 2026-02-25 19:43:32 +00:00
Dev
d54d78ccc5 - Default URL in back button 2026-02-25 19:41:00 +00:00
9ff4d6c44d - Restored PHP 8.3 compatibility. 2026-02-25 19:41:00 +00:00
a4b02607f3 - WIP on skeleton 2026-02-25 19:41:00 +00:00
d74c916558 - Added createStream methods and fixed multiple errors views 2026-02-25 19:40:58 +00:00
Dave Mc Nicoll
ca388e8a52 - Merged with master done 2026-02-25 19:40:07 +00:00
b12fc65ea9 Fixed missing namespace of Factory 2026-02-25 19:39:12 +00:00
4b76a387fe - Various fixes bugs and missing code in project's skeleton 2026-02-25 19:39:12 +00:00
Dave Mc Nicoll
1c2ce07179 - Fixed merges of latest master 2025-06-13 19:25:08 +00:00
Dave Mc Nicoll
af8b686e3b - WIP on ulmus-user mechanics updates 2025-06-13 19:14:30 +00:00
12 changed files with 97 additions and 36 deletions

View File

@ -1,8 +1,13 @@
<?php
use Ulmus\User\{Entity,
use Lean\Factory\HttpFactoryInterface;
use Ulmus\User\{Authorize\HeaderAuthentication,
Entity,
Lib\Authenticate,
Lib\Authorize,
Middleware\AuthenticationMiddleware,
Middleware\HeaderAuthenticationMiddleware,
Middleware\PostRequestAuthenticationMiddleware,
Authorize\PostRequestAuthentication};
@ -11,24 +16,29 @@ use Picea\Picea;
use Storage\{ Cookie, Session };
use function DI\{get, create};
use Psr\Container\ContainerInterface;
use function DI\{get, autowire, create};
return [
Authenticate::class => create(Authenticate::class)->constructor(get(Entity\UserInterface::class), get(Session::class), get(Cookie::class), get('authentication.method')),
Authorize::class => create(Authorize::class)->constructor(get(Entity\UserInterface::class), get(Session::class), get(Cookie::class), get('authentication.method')),
HeaderAuthenticationMiddleware::class => create(HeaderAuthenticationMiddleware::class)->constructor(get(Authorize::class), get(Entity\UserInterface::class), get('authorize.error')),
Authenticate::class => create(Authenticate::class)->constructor(get(Entity\UserInterface::class), get(Session::class), get(Cookie::class), get('authentication.method')),
PostRequestAuthentication::class => create(PostRequestAuthentication::class)->constructor(get(Authenticate::class), "email", "email", "password"),
AuthenticationMiddleware::class => create(AuthenticationMiddleware::class)->constructor(get(Authorize::class), get('authorize.error')),
PostRequestAuthenticationMiddleware::class => create(PostRequestAuthenticationMiddleware::class)->constructor(get(Entity\UserInterface::class), get('authentication.error'), get(PostRequestAuthentication::class)),
HeaderAuthentication::class => autowire(HeaderAuthentication::class),
HeaderAuthenticationMiddleware::class => create(HeaderAuthenticationMiddleware::class)->constructor(get(HeaderAuthentication::class)),
PostRequestAuthentication::class => create(PostRequestAuthentication::class)->constructor("email", "email", "password"),
PostRequestAuthenticationMiddleware::class => create(PostRequestAuthenticationMiddleware::class)->constructor(get(PostRequestAuthentication::class)),
'authentication.method' => null,
'authorize.error' => function($c) {
'authorize.error' => function(ContainerInterface $c) {
return function(array $errorData) use ($c) {
return $c->get(\Lean\Factory\HttpFactoryInterface::class)::createJsonResponse($errorData + [
return $c->get(HttpFactoryInterface::class)::createJsonResponse($errorData + [
'api.error' => "Authorization failed",
'api.datetime' => (new \DateTime)->format(\DateTime::ATOM),
], 403);
@ -36,8 +46,9 @@ return [
},
'authentication.error' => function($c, Picea $picea) {
return function($message) use ($picea, $c) {
return $c->get(\Lean\Factory\HttpFactoryInterface::class)::createHtmlResponse($picea->renderHtml('lean/error/500', [
return function($message) use ($c, $picea) {
return $c->get(HttpFactoryInterface::class)::createHtmlResponse($picea->renderHtml('lean/error/500', [
'title' => "Authentication failed",
'subtitle' => "",
'message' => $message,

View File

@ -1,11 +1,13 @@
<?php
use Lean\ApplicationStrategy\{ ThrowableHandler, ThrowableHandlerInterface, NotFoundDecoratorInterface, NotFoundDecorator, MethodNotAllowedInterface, };
use function DI\autowire, DI\create, DI\get;
use Psr\Container\ContainerInterface;
use Psr\Http\Message\ServerRequestInterface;
use Laminas\{ Diactoros\ServerRequestFactory, HttpHandlerRunner\Emitter\EmitterInterface, HttpHandlerRunner\Emitter\SapiEmitter };
use Lean\Factory\{ HttpFactory, HttpFactoryInterface };
use Picea\Picea;
use function DI\{ autowire, create, get };
return [
ServerRequestInterface::class => function ($c) {
@ -15,7 +17,22 @@ return [
},
EmitterInterface::class => create(SapiEmitter::class),
ThrowableHandlerInterface::class => autowire(ThrowableHandler::class),
NotFoundDecoratorInterface::class => autowire(NotFoundDecorator::class),
# MethodNotAllowedInterface::class => autowire(MethodNotAllowedDecorator::class),
HttpFactoryInterface::class => create(HttpFactory::class),
'error.401' => function(ContainerInterface $c, Picea $picea) {
return $c->get(HttpFactoryInterface::class)::createHtmlResponse($picea->renderHtml("lean/error/401", []), 401);
},
'error.404' => function(ContainerInterface $c, Picea $picea) {
return $c->get(HttpFactoryInterface::class)::createHtmlResponse($picea->renderHtml("lean/error/404", []), 404);
},
'error.500' => function(ContainerInterface $c, Picea $picea) {
return $c->get(HttpFactoryInterface::class)::createHtmlResponse($picea->renderHtml("lean/error/500", []), 500);
}
];

View File

@ -68,7 +68,8 @@ return [
}
}
$router->addPatternMatcher('email', '[^@ \t\r\n]+@[^@ \t\r\n]+\.[^@ \t\r\n]+');
$router->addPatternMatcher('email', '[^@ \t\r\n]+@[^@ \t\r\n]+\.[^@ \t\r\n/]+');
$router->addPatternMatcher('ids', '\b\d[\d,]*\b');
$routing = $container->get(Lean\Routing::class);
$routing->registerRoute($container, getenv('URL_BASE'));

0
skeleton/cli Executable file → Normal file
View File

View File

@ -10,7 +10,7 @@ return [
],
'keys' => (function() {
return explode(',', getenv('KEYS') ?? "") ;
return explode(',', getenvonce('KEYS') ?? "") ;
})(),
'meta' => [

View File

@ -4,6 +4,7 @@ use function DI\autowire, DI\create, DI\get;
use %NAMESPACE%\Entity;
use Psr\Container\ContainerInterface;
use Psr\Http\Message\ServerRequestInterface;
use Ulmus\Entity\Field\Datetime,
@ -21,16 +22,18 @@ use TheBugs\Email\{ EmailConfiguration, MailerInterface, SwiftMailer };
use Taxus\{ Taxus, PermissionGrantInterface };
use Lean\Factory\HttpFactoryInterface;
return [
\Ulmus\User\Entity\UserInterface::class => autowire(Entity\User::class),
SecurityHandler::class => create(SecurityHandler::class)->constructor(function() {
return Lean\Factory\HttpFactory::createRedirectResponse(getenv("URL_BASE")."/login");
SecurityHandler::class => create(SecurityHandler::class)->constructor(function(ContainerInterface $c) {
return $c->get(HttpFactoryInterface::class)::createRedirectResponse(getenv("URL_BASE")."/login");
}, get('authentication.unauthorize'), get(Taxus::class)),
'authentication.unauthorize' => function($c, Picea $picea) {
return function($message) use ($picea) {
return Lean\Factory\HttpFactory::createHtmlResponse($picea->renderHtml('lean/error/401', [
'authentication.unauthorize' => function(ContainerInterface $c, Picea $picea) {
return function($message) use ($c, $picea) {
return $c->get(HttpFactoryInterface::class)::createHtmlResponse($picea->renderHtml('lean/error/401', [
'title' => "",
'subtitle' => "",
'message' => $message,

View File

@ -4,7 +4,7 @@ use Picea\Picea;
use Negundo\Client\{ NegundoMiddleware, SoftwareConfig };
use Lean\Factory\HttpFactory;
use Lean\Factory\HttpFactoryInterface;
use Psr\Http\Server\MiddlewareInterface,
Psr\Http\Message\ServerRequestInterface,
@ -31,11 +31,11 @@ return [
"errorHandler" => create(NegundoMiddleware::class)->constructor(get(SoftwareConfig::class), null, get('app.errorhandler.html')),
'app.errorhandler.html' => function($c, Picea $picea) {
return function(\Throwable $exception) use ($picea) {
'app.errorhandler.html' => function(\Psr\Container\ContainerInterface $c, Picea $picea) {
return function(\Throwable $exception) use ($c, $picea) {
error_log($exception->getMessage());
return HttpFactory::createHtmlResponse($picea->renderHtml('lean/error/500', [
return $c->get(HttpFactoryInterface::class)::createHtmlResponse($picea->renderHtml('lean/error/500', [
'title' => "Une erreur s'est produite lors de l'exécution du script.",
'subtitle' => "Êtes-vous connecté avec le bon compte ?",
'message' => $exception->getMessage(),

View File

@ -38,4 +38,37 @@ class ApplicationStrategy extends Strategy\ApplicationStrategy {
{
return $this->getContainer()->has(MethodNotAllowedInterface::class) ? $this->getContainer()->get(MethodNotAllowedInterface::class) : parent::getMethodNotAllowedDecorator($exception);
}
/*
<<<<<<< HEAD
public function getMethodNotAllowedDecorator(MethodNotAllowedException $exception): MiddlewareInterface
{
return $this->getContainer()->has(MethodNotAllowedInterface::class) ? $this->getContainer()->get(MethodNotAllowedInterface::class) : parent::getMethodNotAllowedDecorator($exception);
=======
public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
{
if (php_sapi_name() !== 'cli' and ! defined('STDIN')) {
return $this->throw404($request);
}
return $handler->handle($request);;
}
public function throw404(ServerRequestInterface $request) : ResponseInterface
{
if ( getenv('DEBUG') && $this->di->has(\Picea\Asset\Asset::class) ) {
$params = $request->getServerParams();
$scpName = basename(explode('?', $params['REQUEST_URI'] ?? "", 2)[0]);
list(, $ext) = array_pad(explode('.', $scpName), 2, null);
if ($ext && in_array($ext, ApplicationStrategy::ASSET_TRIGGER_UPDATE)) {
$this->di->get(\Picea\Asset\Asset::class)->launchInstall();
}
}
return $this->di->get('error.404');
}
};
>>>>>>> af8b686 (- WIP on ulmus-user mechanics updates)
}*/
}

View File

@ -39,7 +39,7 @@ class NotFoundDecorator implements NotFoundDecoratorInterface
public function throw404(ServerRequestInterface $request) : ResponseInterface
{
return $this->checkAssetTrigger($request) ?: $this->httpFactory->createHtmlResponse($this->picea->renderHtml("lean/error/404", [], $this), 404);
return $this->checkAssetTrigger($request) ?: $this->container->get('error.404');
}
protected function checkAssetTrigger(ServerRequestInterface $request) : false|ResponseInterface

View File

@ -63,6 +63,6 @@ class HttpFactory implements HttpFactoryInterface
public static function createStream(string $content): StreamInterface
{
return (new StreamFactory())->createStream($content);
return new StreamFactory()->createStream($content);
}
}

View File

@ -2,9 +2,6 @@
namespace Lean\Factory;
use Laminas\Diactoros\Response\{EmptyResponse, HtmlResponse, JsonResponse, RedirectResponse, TextResponse};
use Lean\Response\{ DownloadResponse, ImageResponse, FileDownloadResponse, PdfResponse };
use Laminas\Diactoros\Response;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\StreamInterface;
@ -20,6 +17,5 @@ interface HttpFactoryInterface
public static function createDownloadableResponse(string $data, string $filename, int $code = 200, array $headers = []) : ResponseInterface;
public static function createImageResponse(string $data, int $code = 200, array $headers = []) : ResponseInterface;
public static function createFileDownloadResponse(string $path, int $code = 200, array $headers = []) : ResponseInterface;
public static function createStream(string $content) : StreamInterface;
}

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 2.3 KiB

After

Width:  |  Height:  |  Size: 40 KiB