summaryrefslogtreecommitdiff
path: root/ucb/source
AgeCommit message (Collapse)Author
2023-11-11Move user agent initialization to InitCurl_easyMike Kaganski
Places that didn't initialize it previously, would benefit automatically Change-Id: I2f1ff25fc58d9378462072bc92d7b37be2370fc8 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/159299 Tested-by: Jenkins Reviewed-by: Mike Kaganski <mike.kaganski@collabora.com>
2023-11-09tdf#146386 curl,ucb: remove FTP UCPMichael Stahl
FTP support has been deprecated since LO 7.4. The UCP currently doesn't even support TLS connections. Also disable FTP protocol in libcurl. Also remove JunitTest_ucb_complex: turns out the only test in it, checkWrongFtpConnection, fails on Linux because now GIO UCP handles ftp:// URLs and it throws InteractiveAugmentedIOException instead of expected ones, and on other platforms it would fail differently because there is no GIO. Change-Id: I4631d124371fef390f105fb16bf09aaa59e739e7 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/159065 Tested-by: Jenkins Reviewed-by: Michael Stahl <michael.stahl@allotropia.de>
2023-11-09officecfg,*: add Office::Security::Net::AllowInsecureProtocolsMichael Stahl
By default, unencrypted network connections are allowed. But now it can be disabled, for everything that uses libcurl. Change-Id: I8e103f5a968ace2a19fdb9d6934c9a51b2aeabe4 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/159011 Tested-by: Jenkins Reviewed-by: Michael Stahl <michael.stahl@allotropia.de>
2023-11-07curl: mitigate migration to OpenSSL on LinuxMichael Stahl
The problem is that curl 8.3.0 removed the NSS backend, so we now have no other choice than to use the bundled OpenSSL on Linux. Currently any curl https connection fails with: CurlSession.cxx:963: curl_easy_perform failed: (60) SSL certificate problem: unable to get local issuer certificate Apparently this requires manually telling curl which CA certificates to trust; there is a configure flag --with-ca-bundle but that is useless as it tries to load the file relative to whatever is the current working directory, and also did i mention that there are at least 3 different locations where a Linux system may store its system trusted CA certificates because ALL ABOUT CHOICE. So add a new header with an init function to try out various file locations listed in this nice blog article and call it from way too many places that independently use curl. https://www.happyassassin.net/posts/2015/01/12/a-note-about-ssltls-trusted-certificate-stores-and-platforms/ TODO: perhaps bundle a cacert.pem as a fallback in case the system chose to innovate by putting its certificates in yet another unexpected place (regression from commit c2930ebff82c4f7ffe8377ab82627131f8544226) Change-Id: Ibf1cc0069bc2ae011ecead9a4c2b455e94b01241 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/158915 Tested-by: Jenkins Reviewed-by: Michael Stahl <michael.stahl@allotropia.de>
2023-10-28use more XModel3::getArgs2Noel Grandin
to avoid needing to query other, rather expensive properties Change-Id: I34ebc7a03e468f0a7fa9964954e5690ad336016a Reviewed-on: https://gerrit.libreoffice.org/c/core/+/158579 Tested-by: Jenkins Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
2023-10-23Extended loplugin:ostr: Rewrite some O[U]StringLiteral -> O[U]StringStephan Bergmann
...in include files. This is a mix of automatic rewriting in include files and manual fixups (mostly addressing loplugin:redundantfcast) in source files that include those. Change-Id: I1f3cc1e67b9cabd2e9d61a4d9e9a01e587ea35cc Reviewed-on: https://gerrit.libreoffice.org/c/core/+/158337 Tested-by: Jenkins Reviewed-by: Stephan Bergmann <sbergman@redhat.com>
2023-10-20Extended loplugin:ostr: Automatic rewrite O[U]StringLiteral: ucbStephan Bergmann
Change-Id: Ic3123585203ebcdf2fe791709d38551e7a326d04 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/158246 Tested-by: Jenkins Reviewed-by: Stephan Bergmann <sbergman@redhat.com>
2023-10-14Use exception ctors, instead of setting members laterMike Kaganski
Avoids overwriting source location in message Change-Id: Ia0290c7dd1ab3ea1357712a27ecab75c7b583dd4 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/157893 Tested-by: Jenkins Reviewed-by: Mike Kaganski <mike.kaganski@collabora.com>
2023-10-11upgrade to libcmis 0.6.0Caolán McNamara
Change-Id: Ia22d2efca14b1f55f45a4ecb9c487591c3117e17 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/157704 Tested-by: Caolán McNamara <caolan.mcnamara@collabora.com> Reviewed-by: Caolán McNamara <caolan.mcnamara@collabora.com>
2023-09-10using decls should come after #includeNoel Grandin
Change-Id: I058551e87bca42adede860f6f299b0f7ae2af3b5 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/156798 Tested-by: Jenkins Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
2023-08-28new loplugin:optionalboolNoel Grandin
which warns against using the 'operator bool' conversion of std::optional<bool> which can lead to interesting bugs The bugs that this plugin have been submitted independantly, so this change is just using has_value() in relevant places. Change-Id: I259b837feeecddcb8cd1d7e5db1e85bf505907cb Reviewed-on: https://gerrit.libreoffice.org/c/core/+/155978 Tested-by: Jenkins Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
2023-08-18ucbhelper,ucb,desktop: InternetProxyServer is problematicMichael Stahl
It turns out that every single client of InternetProxyDecider simply concatenates the 2 members of InternetProxyServer into a single string and passes it on to curl_easy_setopt(CURLOPT_PROXY), which will happily take a URL including scheme and everything. It turns out that the awful GetUnixSystemProxy() tries to cut off the scheme in a terrible way, but GetPACProxy() does no such thing and WINHTTP_PROXY_INFO::lpszProxy may or may not contain scheme in its entries; fix this to only separate the port and leave the rest alone. So why do we need a InternetProxyServer struct? Because officecfg has separate entries that correspond to its members, and so InternetProxyDecider gets separate events on its listener interface when any of them changes, which is easiest to handle if it stores these separately. So just return a concatenated URL with or without scheme in getProxy(). Change-Id: I43c696471c8bec90667b5930fa00975adb432fe1 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/155840 Tested-by: Jenkins Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
2023-08-18Fix curl proxy access for non-authenticated proxyNoel Grandin
If rSession.m_Proxy.aName is a simple host-name, the CurlUri constructor will fail with CURLUE_BAD_SCHEME, so just ignore the error here, we only care about parsing out the username/password Change-Id: Iec2d6e7315a5899ddddf6120a43199b75bf62db2 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/155834 Tested-by: Jenkins Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
2023-07-01Use getXWeak in ucbMike Kaganski
Change-Id: Id94a89596bd473ed8c83d7be89ba673d8dc1bba1 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/150878 Tested-by: Jenkins Reviewed-by: Mike Kaganski <mike.kaganski@collabora.com>
2023-06-28Simplify a bitMike Kaganski
Change-Id: Iad2564853a2a0d74cd526b1574e421e121fd6986 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/153644 Tested-by: Jenkins Reviewed-by: Mike Kaganski <mike.kaganski@collabora.com>
2023-06-27loplugin:stringstatic look for more stringsNoel Grandin
that can be initialised at compile-time instead of runtime Change-Id: I08d516fdc13a3a79f93c079f89ac44cbc7a1ed71 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/153620 Tested-by: Jenkins Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
2023-06-26new loplugin:constexprliteralNoel Grandin
OUStringLiteral should be declared constexpr, to enforce that it is initialised at compile-time and not runtime. This seems to make a different at least on Visual Studio Change-Id: I1698f5fa22ddb480347c2f4d444530c2e0e88d92 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/153499 Tested-by: Jenkins Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
2023-06-15ooo#41037 Reject URLs containing unencoded NUL charactersStephan Bergmann
Change-Id: I45bbd342734f190ce918b610441ca911a47830b4 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/153062 Tested-by: Jenkins Reviewed-by: Stephan Bergmann <sbergman@redhat.com>
2023-06-07ucb: webdav-curl: auth data is invalid when receiving 401Michael Stahl
Even if it used to be valid before; unfortunately newly entered credentials weren't actually used because the flag was never reset. Change-Id: Ib36689f40ff780596b9cfe6fe589a6f2e79cfcd2 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/152679 Tested-by: Jenkins Reviewed-by: Michael Stahl <michael.stahl@allotropia.de>
2023-05-25merge some stringaddsNoel Grandin
found with a lightly tweaked version of the loplugin:stringadd and some hand-holding. Change-Id: I146aadcaf665e98fea89a9cad2df4dc3935622f4 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/152275 Tested-by: Jenkins Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
2023-04-25Fix tdf#155004: ucb: webdav-curl: carry over Class1 bit only if setMichael Stahl
With d6182cb6704c06f33d284874b9fe96c85cce5bf5 there are cases when a webdav server inadvertendly releases the lock. Lets apply the fix only if the Class1 flag is actually set. Change-Id: I85e5253c7df0980f373d2dea788c331b81ed4a82 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/150552 Tested-by: László Németh <nemeth@numbertext.org> Reviewed-by: László Németh <nemeth@numbertext.org> Tested-by: Jenkins
2023-04-24loplugin:unnecessarygetstr extend to more std::string checkingNoel Grandin
suggested by mike kaganski Change-Id: I5f5f254142767aca45a6101abdd84a0163ca6a34 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/150936 Tested-by: Jenkins Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
2023-04-14loplugin:stringviewparam improvementsNoel Grandin
improve the check by checking for methods that exclude using string_view, rather than checking for methods that __can__ use string_view, which leads to exposing some holes in our o3tl/string_view.hxx coverage. Change-Id: Ic9dd60441c671f502692f9cd2a1bb67301c4b960 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/150277 Tested-by: Jenkins Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
2023-04-09new loplugin:unnecessarygetstrNoel Grandin
which prevents constructing unnecessary temporaries via getStr() Change-Id: I9ca70893a10e954b5ee0e6ad6098660ee24c2bef Reviewed-on: https://gerrit.libreoffice.org/c/core/+/150170 Tested-by: Jenkins Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
2023-04-09use more OUStringToOStringNoel Grandin
which makes it easier to pass around string_view in a few places. Change-Id: Icbbb7f56494986582f1c3272404775bd98031240 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/150129 Tested-by: Jenkins Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
2023-04-03Optimize a bitMike Kaganski
Change-Id: I5a2c37e4ff1e19cfbc29e1e61b025f44d067b95a Reviewed-on: https://gerrit.libreoffice.org/c/core/+/149893 Tested-by: Jenkins Reviewed-by: Mike Kaganski <mike.kaganski@collabora.com>
2023-03-30loplugin:stringadd in ucbNoel Grandin
when applying my upcoming patch to also consider O[U]StringBuffer Change-Id: I2445a69dc46314c73f54c190a0c498c0309be06b Reviewed-on: https://gerrit.libreoffice.org/c/core/+/149750 Tested-by: Jenkins Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
2023-03-18loplugin:stringadd use more O[U]StringCharNoel Grandin
Change-Id: I196e4539ad430a39415eff9d7170b33df7228230 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/149062 Tested-by: Jenkins Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
2023-03-10improve loplugin:unnecessarylockingNoel Grandin
to find more locking we can remove Change-Id: Ief7bc5ec2a1ff31f22a0ad366910b7fcc4725818 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/148599 Tested-by: Jenkins Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
2023-03-06clang-tidy dead-storeNoel Grandin
Change-Id: I842114880c43dfcc342b6255b7d17befb905bccb Reviewed-on: https://gerrit.libreoffice.org/c/core/+/148345 Tested-by: Jenkins Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
2023-02-24tdf#153642 ucb: fix broken save with cached DAVOptionsLászló Németh
Trying to save a document within the lifetime of the cached connection, e.g. re-save within a few seconds after the first and successful save failed with an error message in the case of Vibe 4.0.6 WebDAV server. Waiting 5-10 seconds after the last try was the only workaround to re-save the document. Details: aDAVOptionsException in Content::getPropertyValues() removed the isClass1 bit of the cached DAVOptions of the same TargetURL (note: of the folder of the WebDAV document). This disabled the DAV detection part of Content::getResourceType(), and later the correct HTTP redirect for the DAV connection. Fix this by keeping the cached bit in that case, too, when the added connection has a different lifetime, than the cached one. Follow-up to commit 30ca48f4dc0e65a3798e6b21574bc80f6d4953fa "tdf#152493 ucb WebDAV: fix upload using HTTP 1.0 fallback". Change-Id: I5d4578232581a4df654f76198fdddf096cba5267 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/147570 Tested-by: László Németh <nemeth@numbertext.org> Reviewed-by: László Németh <nemeth@numbertext.org>
2023-02-17osl::Mutex->std::mutex in SortedDynamicResultSetListenerNoel Grandin
Change-Id: I70b20a616cb84c5c066431be50359def5d041b3b Reviewed-on: https://gerrit.libreoffice.org/c/core/+/147188 Tested-by: Jenkins Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
2023-02-17osl::Mutex->std::mutex in SortedDynamicResultSetNoel Grandin
Change-Id: I21b98831645e2d7942bdf630225c136f9af3dca3 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/147189 Tested-by: Jenkins Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
2023-02-16osl::Mutex->std::mutex in TaskManagerNoel Grandin
Change-Id: I1ab5183cff5eaed9e3c0821115c7f89850d3b482 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/147160 Tested-by: Jenkins Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
2023-02-16osl::Mutex->std::mutex in ResultSetDataSupplierNoel Grandin
Change-Id: I75cbf133e2e632c41759515fdf8894faed599c8d Reviewed-on: https://gerrit.libreoffice.org/c/core/+/147159 Tested-by: Jenkins Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
2023-02-16osl::Mutex->std::mutex in ucb::ucp::ext::DataSupplierNoel Grandin
Change-Id: Id195c7cb676d4c7e0741adeb31f4b1a9854e8230 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/147100 Tested-by: Jenkins Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
2023-02-15no need to use unique_ptr for OMultiTypeInterfaceContainerHelperVar4Noel Grandin
it has an empty size of two words, so it saves very little memory to use unique_ptr. Change-Id: I2958a83c41929dec3d33db27f084dafec385d74d Reviewed-on: https://gerrit.libreoffice.org/c/core/+/147014 Tested-by: Jenkins Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
2023-02-14no need to use unique_ptr for OInterfaceContainerHelper4Noel Grandin
it has an empty size of one pointer, so it saves no memory to use unique_ptr. Need to fix the const-ness of some methods in OInterfaceContainerHelper4 Change-Id: I0c0c28a228ccfe0e97174fbc83555059fc351b3c Reviewed-on: https://gerrit.libreoffice.org/c/core/+/147007 Tested-by: Jenkins Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
2023-02-14osl::Mutex->std::mutex in SortedResultSetNoel Grandin
Change-Id: Id55c139cfcc55e18811fd79e402a78b123f37394 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/147015 Tested-by: Jenkins Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
2023-02-14fix locking in PersistentPropertySetNoel Grandin
after commit 756185b5795c95180d32d02abfbd65951779b40e Author: Noel Grandin <noel.grandin@collabora.co.uk> Date: Mon Feb 13 09:06:02 2023 +0200 osl::Mutex->std::mutex in PersistentPropertySet Change-Id: Ie52432ea1566b840bd88692f00f4753eea7896f7 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/146998 Tested-by: Jenkins Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
2023-02-13osl::Mutex->std::mutex in ContentResultSetWrapperNoel Grandin
Change-Id: I8d015bf1435c6b3becd40ffd9056b9906a6dd19b Reviewed-on: https://gerrit.libreoffice.org/c/core/+/146938 Tested-by: Jenkins Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
2023-02-13osl::Mutex->std::mutex in DynamicResultSetWrapperNoel Grandin
Change-Id: I218460fac22e65f583a545d41720b0301b67c502 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/146937 Tested-by: Jenkins Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
2023-02-13Fix the buildStephan Bergmann
...after 756185b5795c95180d32d02abfbd65951779b40e "osl::Mutex->std::mutex in PersistentPropertySet" caused > ucb/source/core/ucbstore.cxx:1913:75: error: too few arguments to function call, expected 2, have 1 > m_pPropertyChangeListeners->getContainer( rEvent.PropertyName ); > ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ^ > include/comphelper/multiinterfacecontainer4.hxx:71:50: note: 'getContainer' declared here > inline OInterfaceContainerHelper4<listener>* getContainer(std::unique_lock<std::mutex>& rGuard, > ^ > ucb/source/core/ucbstore.cxx:1921:66: error: too few arguments to function call, expected 2, have 1 > m_pPropertyChangeListeners->getContainer( OUString() ); > ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ^ > include/comphelper/multiinterfacecontainer4.hxx:71:50: note: 'getContainer' declared here > inline OInterfaceContainerHelper4<listener>* getContainer(std::unique_lock<std::mutex>& rGuard, ^ Change-Id: Ie13c7bf17d066607ec7095b3e45ab7d6ecea1cb6 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/146940 Tested-by: Stephan Bergmann <sbergman@redhat.com> Reviewed-by: Stephan Bergmann <sbergman@redhat.com>
2023-02-13osl::Mutex->std::mutex in DynamicResultSetWrapperListenerNoel Grandin
Change-Id: Ie8673462fac30132f4e6b3cf7792d8554bf4f14a Reviewed-on: https://gerrit.libreoffice.org/c/core/+/146901 Tested-by: Jenkins Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
2023-02-13osl::Mutex->std::mutex in PropertySetRegistryNoel Grandin
Change-Id: I08a059998cb13f12ad6183ee54754525386dfcd4 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/146853 Tested-by: Jenkins Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
2023-02-13osl::Mutex->std::mutex in PersistentPropertySetNoel Grandin
Change-Id: If88ac207083a928e2315e2ec1c7ac40951fb2a6d Reviewed-on: https://gerrit.libreoffice.org/c/core/+/146851 Tested-by: Jenkins Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
2023-02-13Fix/simplify some vnd.sun.star.expand: handlingMike Kaganski
The vnd.sun.star.expand: payload must be URL-decoded prior to passing it to expandMacros; the protocol must be checked case-insensitively. Use startsWithIgnoreAsciiCase for that. Change-Id: I2be993a0400a27cb7dc57207cd0824b4505afd2b Reviewed-on: https://gerrit.libreoffice.org/c/core/+/146855 Tested-by: Jenkins Reviewed-by: Mike Kaganski <mike.kaganski@collabora.com>
2023-01-30tdf#152493 ucb WebDAV: fix upload using HTTP 1.0 fallbackLászló Németh
Fix broken libcurl upload to Vibe 4.0.6 WebDAV server using HTTP 1.0 fallback. Regression from commit 023ebf17898db4bca63129f079fd90b5cf76c1a9 "ucb: remove --with-webdav=neon" (Neon had no such upload problem). HTTP 1.0 fallback found by Pál Zoltán Kochis. Fallback for CURLE_UNSUPPORTED_PROTOCOL suggested by Michael Stahl. Thanks for their and Attila Bakos' help. Michael Stahl's comment: "'HTTP/0.9' in the [curl] error message is very misleading: it simply means that a header was expected but there was no header, so what is received is interpreted as body. Note: the HTTP/1.0 works because it does not use the 'Expect: 100-continue' so there should be no intermediate 100 Continue response from the server at all - instead libcurl directly sends the XML document for the PROPFIND and the server sends the response, and the problem does not occur." Co-authored-by: Michael Stahl <michael.stahl@allotropia.de> Change-Id: I8bd79154de14b6425e0324f4d8f6e64512c08264 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/146067 Tested-by: László Németh <nemeth@numbertext.org> Reviewed-by: László Németh <nemeth@numbertext.org>
2023-01-28LOK: Allow image upload from WOPI-like host with self-signed certAndras Timar
Change-Id: I28a7de489b06fd5a993b82bb39274eb6f0c373ce Reviewed-on: https://gerrit.libreoffice.org/c/core/+/146298 Tested-by: Jenkins Reviewed-by: Andras Timar <andras.timar@collabora.com>
2023-01-19tdf#153039 ucb: webdav-curl: fix POST, which was actually doing PUTMichael Stahl
The problem is that first CURLOPT_POST was set and later CURLOPT_UPLOAD, which overrides the HTTP method to PUT. Move this out to the 4 functions that need it. Change-Id: Ibd555dcc00a03baa1bb300a9ab9905f383179c67 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/145786 Tested-by: Jenkins Reviewed-by: Michael Stahl <michael.stahl@allotropia.de>