Discussion:
[TYPO3-german] CHash Problem Typo3 8.7 in Extbase-Ext in CLI (Scheduler)
JÃŒrgen Pfusterschmied
2017-05-15 07:29:14 UTC
Permalink
Liebes Forum,

Über eine Extension sollen automatisierte Tasks (Scheduler, CLI Mode) ablaufen...
Emailversand, Newsletter, Social Media Posts, etc. Dabei sollen allen URLS über RealUrl generiert werden.
Im Frontend Context funktioniert dies. Das Problem im CLI modus ist, dass die URLS entweder nicht über RealUrl (fehldende TSFE u- cObject) laufen bzw. (und das ist das Hauptproblem) kein richtiger cHash erstellt wird. Dh. beim automatischen Versenden eines Links per Email ist dieser link nicht gültig (fehlender oder falscher cHash). Wenn im Installtool der chash parameter disabled wird, funktioniert alles.

Ich habe mir die newsletter und die news Extensions angesehen, konnte aber keinen Lösungsansatz für dieses Problem finden.
Kann mir jemand einen Hinweis geben ? Kennt jemand eine Ext. an die man sich orientieren kann?

LG Jürgen
Stephan Schuler
2017-05-15 12:04:26 UTC
Permalink
Hallo Jürgen.

Auf solche Probleme stößt man leider sehr schnell, wenn man im Backend-Context oder im CLI-Context Frontendoperationen durchführt.
Einen sinnvollen Weg, im Backend einen Frontend-Context zu erzeugen gibt es nicht. Das endet immer im Gefrickel und vollständig von BE auf FE umschalten wirst Du trotzdem nicht können.

Du kannst den Configuration-Manager zum Beispiel dahin vergewaltigen, dass er seine Backend-Config vergisst (die für Controller auf „module“ basiert) und eine Frontend-Config generiert (die auf „plugin“ baisert). Das ist aber weit entfernt von Public API. Damit fängt es bei mir häufig an, das ist der Teil der noch relativ einfach geht.
Technisch musst Du nur die passenden Rahmenbedingungen für Frontend-Settings liefern, also ein globales TSFE. Meiner Meinung nach ist das Extbase-Utility FrontendSimulatorUtility hierfür nicht ausreichend, das TSFE-Objekt das daraus proudziert wird ist nicht funktional. Stattdessen macht das EidUtility mit „initFeUser()“ schon einen halbwegs guten Job, wenn auch das dadurch erzeugte TSFE trotzdem noch nicht vollständig initialisiert ist und außerdem ist es „private static“ im EidUtility, man muss also etwas tricksen um da ran zu kommen. Und wieder sind wir weg von der Public API.

Die Links die Du ansprichst sind schon schwieriger. Der UriBuilder fragt den EnvironmentService nach „isEnvironmentInBackendMode()“, das liest eine PHP-Konstante aus. Das heißt, dass es hier einfach kein Setting gibt mit dem Du den UriBuilder dazu veranlassen kannst, eine FE-Uri zu bauen, wenn Du nicht entweder den EnvironmentService überschreibst oder den UriBuilder selbst, jeweils um eine Möglichkeit, entgegen der Konstante von einem anderen Environment auszugehen. Hier bist Du dann auch wieder sehr weit von Public API entfernt.

https://github.com/TYPO3/TYPO3.CMS/blob/master/typo3/sysext/extbase/Classes/Mvc/Web/Routing/UriBuilder.php#L621
https://github.com/TYPO3/TYPO3.CMS/blob/master/typo3/sysext/extbase/Classes/Service/EnvironmentService.php#L39

Du siehst: Das ist so eigentlich gar nicht vorgesehen.

Wenn ich an FE-Features im Backend muss, baue ich mir in der Regel einen Frontend-Controller dem ich die Daten per POST-Request übergeben kann. Das sieht in der Regel so aus:
• Ein HttpRequest-Objekt innerhalb des CLI ruft eine bestimmte, im BE konfigurierte Seite des Frontends auf.
• Es wird als POST-Payload einerseits ein Model übergeben das dem Frontend-Controller alle Daten liefert die er braucht und andererseits ein per HashService erzeugter MAC des serialisierten Model-Objekts.
• Der Frontend-Controller darf so einerseits prüfen, dass mein Model-Objekt von mir kommt (weil nur ich es per MAC signieren konnte) und andererseits dann auf ein Argument mappen, bevor er sein Frontend-Ding damit durchzieht.
• Hier hast Du dann spontan Timeout- und Memory-Einschränkungen des Frontends die Du im CLI nicht hast.

Grundsätzlich den Umweg über ein wirkliches Frontend zu gehen und den Request dabei so zu signieren, dass er nicht von fremden gefaket werden kann, hab ich mir vor Jahren aus der Solr-Extension abgeschaut, der Index von pages wird dort so erzeugt.

Beste Grüße,



Stephan Schuler
Web-Entwickler | netlogix Web Solutions

Telefon: +49 (911) 539909 - 0
E-Mail: ***@netlogix.de
Web: websolutions.netlogix.de



----------------------------
Neu: Wir sind Amazon Web Services Partner. Mehr erfahren:
https://websolutions.netlogix.de/technologie/amazon-web-services-aws
----------------------------




netlogix GmbH & Co. KG
IT-Services | IT-Training | Web Solutions
Neuwieder Straße 10 | 90411 Nürnberg
Telefon: +49 (911) 539909 - 0 | Fax: +49 (911) 539909 - 99
E-Mail: ***@netlogix.de | Web: http://www.netlogix.de

netlogix GmbH & Co. KG ist eingetragen am Amtsgericht Nürnberg (HRA 13338)
Persönlich haftende Gesellschafterin: netlogix Verwaltungs GmbH (HRB 20634)
Umsatzsteuer-Identifikationsnummer: DE 233472254
Geschäftsführer: Matthias Schmidt
Philipp Gampe
2017-05-15 20:48:58 UTC
Permalink
Hi Jürgen,
Post by JÃŒrgen Pfusterschmied
Ich habe mir die newsletter und die news Extensions angesehen, konnte aber
keinen Lösungsansatz für dieses Problem finden. Kann mir jemand einen
Hinweis geben ? Kennt jemand eine Ext. an die man sich orientieren kann?
1. realurl deaktiviert sich im Backend Kontext (also auch in CLI) komplett,
d.h. du must zumindest realurl an der Stelle überschreiben.

Als xclass:

ext_localconf.php:
$GLOBALS['TYPO3_CONF_VARS']['SYS']['Objects']
[\DmitryDulepov\Realurl\Encoder\UrlEncoder::class] = array(
'className' => \my\foo\Xclass\UrlEncoder::class
);

typo3conf/ext/foo/Classes/Xclass/UrlEncoder.php
<?php
namespace my\foo\Xclass;

class UrlEncoder extends \DmitryDulepov\Realurl\Encoder\UrlEncoder
{

protected function canEncoderExecute()
{
return $this->isRealURLEnabled()
&& !$this->isSimulateStaticEnabled()
&& !$this->isInWorkspace()
&& $this->isTypo3Url()
&& $this->isProperTsfe();
}
}

2. Die Links-erzeugenden Viewhelper von Fluid nutzen einen
EnvironmentService um festzustellen, ob sie im Frontend oder Backend laufen.

typo3conf/ext/foo/Classes/Service/FrontendEnvironmentService.php
<?php
namespace my\foo\Service;

/**
* Service for determining environment params
*/
class FrontendEnvironmentService extends
\TYPO3\CMS\Extbase\Service\EnvironmentService implements
\TYPO3\CMS\Core\SingletonInterface
{
/**
* Detects if TYPO3_MODE is defined and its value is "FE"
*
* @return bool
*/
public function isEnvironmentInFrontendMode()
{
return true;
}

/**
* Detects if TYPO3_MODE is defined and its value is "BE"
*
* @return bool
*/
public function isEnvironmentInBackendMode()
{
return false;
}

/**
* Detects if we are running a script from the command line.
*
* @return bool
*/
public function isEnvironmentInCliMode()
{
return false;
}

/**
* @return string
*/
public function getServerRequestMethod()
{
return 'GET';
}
}

3. Nun entweder den Service mittels Extbase Config in den Viewhelper
injecten oder einfach den Viewhelper überschreiben:

<?php
namespace my\foo\ViewHelpers\Uri;

use my\foo\Service\FrontendEnvironmentService;

/**
* Class ActionViewHelper
*
*/
class ActionViewHelper extends
\TYPO3\CMS\Fluid\ViewHelpers\Uri\ActionViewHelper
{

public function initialize()
{
parent::initialize();
/** @var FrontendEnvironmentService $environment */
$environment = $this->objectManager-
Post by JÃŒrgen Pfusterschmied
get(FrontendEnvironmentService::class);
$uriBuilder = $this->controllerContext->getUriBuilder();
$uriBuilder->injectEnvironmentService($environment);
$this->controllerContext->setUriBuilder($uriBuilder);
}
}


Alles ohne Garantie.

Grüße
--
Philipp Gampe – PGP-Key 0AD96065 – LFCS
TYPO3 CMS Certified Integrator – Certified Developer – Active contributor
TYPO3 ... inspiring people to share!
Loading...