65 Commits
Author SHA1 Message Date
mcndave 8e89466e0b - Added missing Picea using 2026-10-20 13:04:17 +00:00
mcndave ca4b5c98a1 - Merging ulmus-auth branch into master 2026-10-19 16:18:01 -04:00
Dave Mc Nicoll 254ea744c3 - Merged with master done 2026-10-19 20:01:25 +00:00
Dave Mc Nicoll 5839041e4c - Fixed conflicts 2026-10-19 20:01:18 +00:00
mcndave c8f4e181be - Added createStream methods and fixed multiple errors views 2026-10-19 20:01:17 +00:00
mcndave 5ea4e70988 - Added MethodNotAllowed interface 2026-10-19 20:01:11 +00:00
mcndave 3281713534 - Added createStream methods and fixed multiple errors views 2026-10-19 20:01:10 +00:00
Dave Mc Nicoll e3b22335e1 - Merged with master done 2026-10-19 20:01:01 +00:00
Dave Mc Nicoll 6cb5e7bba8 - Rebased 2026-10-19 20:00:54 +00:00
Dave Mc Nicoll e6a41fbfab - WIP on ulmus-user mechanics updates 2026-10-19 20:00:45 +00:00
mcndave e0f2cbac92 - Added MethodNotAllowed interface 2026-10-19 20:00:27 +00:00
Dave Mc Nicoll e32b092749 - Merged with master done 2026-10-19 20:00:26 +00:00
Dave Mc Nicoll 538e0b9aec - Fixed conflicts 2026-10-19 19:59:54 +00:00
Dev 7bad9a69c9 - Fixed default view order to 1000 2026-10-19 19:59:44 +00:00
mcndave f1570d1c42 - Added createStream methods and fixed multiple errors views 2026-10-19 19:59:43 +00:00
mcndave 71b9ca68ec - Added MethodNotAllowed interface 2026-10-19 19:59:28 +00:00
Dave Mc Nicoll 020227abfe - Fixed email route argument pattern and added getenvonce() method 2026-10-19 19:58:55 +00:00
Dave Mc Nicoll 8090e493b5 -Rebasing 2026-10-19 19:58:21 +00:00
mcndave 75c480496a - WIP on skeleton 2026-10-19 19:56:06 +00:00
mcndave bbf8566fd2 - Added createStream methods and fixed multiple errors views 2026-10-19 19:56:06 +00:00
Dave Mc Nicoll 9c5e8c66ff - Merged with master done 2026-10-19 19:55:34 +00:00
Dave Mc Nicoll 50b17ec8b6 - WIP on ulmus-user mechanics updates 2026-10-19 19:55:28 +00:00
mcndave 064d94d32a - Fixed conflict 2026-10-19 19:54:02 +00:00
mcndave aa15850baa - Done working on package manager 2026-10-19 19:54:02 +00:00
mcndave c7469af952 - WIP on package manager 2026-10-19 19:54:02 +00:00
mcndave 3a60aaaf56 - Allowed next Ulmus version into lean 2026-10-19 19:54:02 +00:00
mcndave dce553d688 - WIP on integrating package manager 2026-10-19 19:54:02 +00:00
mcndave 1a5d4dd0b2 - Some bugfixes made in skeleton dir and fixed 'email' route pattern 2026-10-19 19:53:59 +00:00
mcndave 5769f600fe - Added PHP 8.5 supports
- Fixed some minor bugs
2026-10-19 19:53:02 +00:00
mcndave 7a292fe373 - Removed E_STRICT error type, added some more content to skeleton and removed 'methods' of route attributes (replaced with 'method') 2026-10-19 19:52:24 +00:00
mcndave 79287f28cc - Fixed a missing variable bug 2026-10-19 19:52:24 +00:00
mcndave 2a688935cc - Fixed errorLogPath default value if none is provided 2026-10-19 19:52:24 +00:00
mcndave a903153fe2 - Fix conflicts 2026-10-19 19:52:24 +00:00
Dave Mc Nicoll ec59a36afb - removed getenvonce, placed in env dir instead 2026-10-19 19:52:24 +00:00
mcndave 9556a2cba6 - Added createStream methods and fixed multiple errors views 2026-10-19 19:52:23 +00:00
mcndave 1c44342bbf - Added MethodNotAllowed interface 2026-10-19 19:51:33 +00:00
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
mcndave 7ed88ec89f - Added createStream methods and fixed multiple errors views 2026-06-01 15:23:11 +00:00
mcndave 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
mcndave 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
mcndave 7ee4b2d8bb - Added createStream methods and fixed multiple errors views 2026-06-01 15:22:38 +00:00
mcndave 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
mcndave 16ee06593c - Added createStream methods and fixed multiple errors views 2026-05-21 15:18:03 +00:00
mcndave 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
mcndave 9ff4d6c44d - Restored PHP 8.3 compatibility. 2026-02-25 19:41:00 +00:00
mcndave a4b02607f3 - WIP on skeleton 2026-02-25 19:41:00 +00:00
mcndave 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
mcndave b12fc65ea9 Fixed missing namespace of Factory 2026-02-25 19:39:12 +00:00
mcndave 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
14 changed files with 123 additions and 53 deletions

No files matched your search

+32 -14
View File
@@ -1,9 +1,17 @@
<?php
use Ulmus\User\{Entity,
use Lean\Factory\HttpFactoryInterface;
use Ulmus\User\{
Authorize\CookieAuthentication,
Authorize\HeaderAuthentication,
Entity,
Lib\Authenticate,
Lib\Authorize,
Middleware\AuthenticationMiddleware,
Middleware\HeaderAuthenticationMiddleware,
Middleware\CookieAuthenticationMiddleware,
Middleware\PostRequestAuthenticationMiddleware,
Middleware\LocalMacAddressMiddleware,
Authorize\MacAddressAuthentication,
@@ -13,18 +21,27 @@ 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)),
CookieAuthentication::class => autowire(CookieAuthentication::class),
CookieAuthenticationMiddleware::class => create(CookieAuthenticationMiddleware::class)->constructor(get(CookieAuthentication::class), get(Cookie::class)),
PostRequestAuthentication::class => create(PostRequestAuthentication::class)->constructor("email", "email", "password"),
PostRequestAuthenticationMiddleware::class => create(PostRequestAuthenticationMiddleware::class)->constructor(get(PostRequestAuthentication::class)),
MacAddressAuthentication::class => create(MacAddressAuthentication::class)->constructor(get(Authenticate::class), "mac"),
@@ -32,18 +49,19 @@ return [
'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 + [
'api.error' => "Authorization failed",
'api.datetime' => (new \DateTime)->format(\DateTime::ATOM),
], 403);
return $c->get(HttpFactoryInterface::class)::createJsonResponse($errorData + [
'api.error' => "Authorization failed",
'api.datetime' => (new \DateTime)->format(\DateTime::ATOM),
], 403);
};
},
'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,
+37 -1
View File
@@ -1,11 +1,18 @@
<?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 Storage\Cookie,
Storage\Session,
Storage\SessionMiddleware;
use function DI\{ autowire, create, get };
return [
ServerRequestInterface::class => function ($c) {
@@ -19,4 +26,33 @@ return [
NotFoundDecoratorInterface::class => autowire(NotFoundDecorator::class),
# MethodNotAllowedInterface::class => autowire(MethodNotAllowedDecorator::class),
HttpFactoryInterface::class => create(HttpFactory::class),
Cookie::class => create(Cookie::class)->constructor([
'secure' => true,
'path' => getenv('URL_BASE') ?: '/',
'httponly' => true,
'samesite'=> "Lax",
], getenv("LEAN_RANDOM")),
Session::class => create(Session::class)->constructor(get(Cookie::class), [ 'path' => getenv('URL_BASE') ?: '/', ]),
SessionMiddleware::class => create(SessionMiddleware::class)->constructor(get(Cookie::class), [
'name' => "lean_sess_" . substr(md5(getenv("LEAN_RANDOM")), 0, 12),
'path' => getenv('URL_BASE') ?: '/',
'samesite' => getenv("LEAN_COOKIE_SAMESITE") ?? "Lax",
'secure' => (bool) getenv('LEAN_COOKIE_SECURE') ?? false
]),
'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);
},
];
+7 -1
View File
@@ -15,6 +15,11 @@ use Notes\Breadcrumb\Breadcrumb;
use Storage\SessionMiddleware;
use Ulmus\User\Middleware\{
HeaderAuthenticationMiddleware,
PostRequestAuthenticationMiddleware
};
use Psr\Http\Message\{ ResponseInterface, ServerRequestInterface };
return [
@@ -65,7 +70,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'));
-9
View File
@@ -6,9 +6,6 @@ use TheBugs\JavascriptMiddleware;
use Lean\Lean;
use Storage\Cookie,
Storage\Session,
Storage\SessionMiddleware;
use function DI\autowire, DI\create, DI\get, DI\add;
@@ -78,12 +75,6 @@ return [
JavascriptMiddleware::class => create(JavascriptMiddleware::class),
Cookie::class => create(Cookie::class)->constructor([ 'secure' => true, 'path' => getenv('URL_BASE') ?: '/', ], getenv("LEAN_RANDOM")),
Session::class => create(Session::class)->constructor(get(Cookie::class), [ 'path' => getenv('URL_BASE') ?: '/', ]),
SessionMiddleware::class => create(SessionMiddleware::class)->constructor(get(Cookie::class), [ 'name' => "lean_sess_" . substr(md5(getenv("LEAN_RANDOM")), 0, 12), 'path' => getenv('URL_BASE') ?: '/' ]),
'git.commit' => function($c) {
if ( getenv("DEBUG") ) {
return uniqid("debug_");
Executable → Regular
View File
File mode changed.
-1
View File
@@ -37,7 +37,6 @@
"mcnd/picea-ui": "dev-master",
"mcnd/picea-asset": "~1.0.2",
"mcnd/cronard": "dev-master",
"mcnd/lean-api": "dev-master",
"mcnd/lean-console": "~1.3.2",
"mcnd/kash": "dev-master",
"mcnd/taxus": "dev-master",
+1 -1
View File
@@ -10,7 +10,7 @@ return [
],
'keys' => (function() {
return explode(',', getenv('KEYS') ?? "") ;
return explode(',', getenvonce('KEYS') ?? "") ;
})(),
'meta' => [
+8 -5
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,
+4 -4
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(),
@@ -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
+11 -1
View File
@@ -7,11 +7,11 @@ use Lean\Factory\HttpFactory;
use Notes\Attribute\Ignore;
use Notes\Route\Attribute\Object\Route;
use Notes\Security\Attribute\Security;
use Picea, Picea\Ui\Method\FormContext;
use Picea\Ui\Method\FormContextInterface;
use TheBugs\Email\MailerInterface;
use Storage\{ Cookie, Session };
use League\CommonMark\CommonMarkConverter;
use Picea;
use Psr\Http\Message\{ ServerRequestInterface, ResponseInterface };
@@ -210,6 +210,16 @@ trait ControllerTrait {
return $this->picea->compiler->getExtensionFromToken('route')->buildRouteUrl($name, $parameters);
}
#[Ignore]
public function form(FormInterface $form, ? FormContextInterface $formContext = null) : Picea\Ui\Method\FormHandler
{
if (! $this->picea ) {
throw new \Exception("A picea object must be provided on class initialization to use this method.");
}
return $this->picea->compiler->getExtensionInstanceOf(Picea\Ui\Method\Form::class)->formClass($form, $formContext);
}
#[Ignore]
public function json($data, int $flags = 0) : string
{
-4
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;
}
+17 -11
View File
@@ -11,13 +11,16 @@ use League\Route\Strategy\ApplicationStrategy;
use Psr\Http\Message\ServerRequestInterface;
use Tell\I18n;
use Ulmus\Container\AdapterProxy;
use Laminas\Diactoros\ServerRequestFactory,
Laminas\HttpHandlerRunner\Emitter\EmitterInterface;
use Ulmus\Ulmus;
class Kernel
{
class Kernel {
protected Container $container;
protected string $locale;
@@ -34,10 +37,12 @@ class Kernel
public function __construct(
public string $projectPath
)
{
) {
# Still not sure about adding a folder check each call just to add a basic project setup error ...
# File::assertFolderExists($this->projectPath);
define('IS_CLI', php_sapi_name() === 'cli' OR defined('STDIN'));
$this->setEnvironment();
$this->initializeEngine();
$this->setupContainer();
@@ -74,12 +79,14 @@ class Kernel
// Paths and directories
foreach($this->paths as $name => $envkey) {
if (!getenv($name)) {
if ( ! getenv($name) ) {
$path = getenv("PROJECT_PATH") . DIRECTORY_SEPARATOR . getenv($envkey);
if (getenv('DEBUG') && ! file_exists($path)) {
if (false === mkdir($path, 0755, true)) {
throw new \Exception(sprintf("Folder '%s' could not be created", $path));
if (false === @mkdir($path, 0755, true)) {
if (! IS_CLI) {
throw new \Exception(sprintf("Folder '%s' could not be created", $path));
}
}
}
@@ -96,7 +103,7 @@ class Kernel
setlocale(LC_ALL, $this->locale = getenv("DEFAULT_LOCAL"));
setlocale(LC_TIME, getenv("DEFAULT_TIME"), getenv("DEFAULT_TIME_FALLBACK"));
if (class_exists('Locale')) {
if ( class_exists('Locale') ) {
\Locale::setDefault($this->locale);
}
@@ -122,8 +129,7 @@ class Kernel
if (getenv("APP_ENV") === "prod") {
if (getenv("CACHE_PATH")) {
# check if ACPU is there first,
# $containerBuilder->enableDefinitionCache(); # Do not work .. ?
# check if ACPU is there first, $containerBuilder->enableDefinitionCache();
$containerBuilder->enableCompilation(getenv("CACHE_PATH") . "/di/");
# No proxies yet... $containerBuilder->writeProxiesToFile(true, getenv("CACHE_PATH") . "/di/");
@@ -190,4 +196,4 @@ class Kernel
return $this;
}
}
};
+5
View File
@@ -44,6 +44,11 @@ class Routing {
$container->set(ServerRequestInterface::class, $request);
# Decoding arguments received from the router
foreach($arguments as &$arg) {
$arg = urldecode($arg);
}
return $this->response ?? $object->$method($request, $arguments);
});
}