2013-08-21 02:58:15 +04:00
< ? php
2015-03-26 13:44:34 +03:00
/**
2016-07-21 18:07:57 +03:00
* @ copyright Copyright ( c ) 2016 , ownCloud , Inc .
2016-10-31 13:07:54 +03:00
* @ copyright Copyright ( c ) 2016 , Lukas Reschke < lukas @ statuscode . ch >
2016-07-21 18:07:57 +03:00
*
2020-03-31 11:49:10 +03:00
* @ author Arne Hamann < kontakt + github @ arne . email >
2016-05-26 20:56:05 +03:00
* @ author Arthur Schiwon < blizzz @ arthur - schiwon . de >
2015-03-26 13:44:34 +03:00
* @ author Bart Visscher < bartv @ thisnet . nl >
* @ author Bernhard Posselt < dev @ bernhard - posselt . com >
* @ author Bernhard Reiter < ockham @ raz . or . at >
2016-07-21 18:07:57 +03:00
* @ author Bjoern Schiessle < bjoern @ schiessle . org >
2016-05-26 20:56:05 +03:00
* @ author Björn Schießle < bjoern @ schiessle . org >
2017-11-06 17:56:42 +03:00
* @ author Christopher Schäpers < kondou @ ts . unde . re >
2019-12-03 21:57:53 +03:00
* @ author Christoph Wurst < christoph @ winzerhof - wurst . at >
2017-11-06 17:56:42 +03:00
* @ author Damjan Georgievski < gdamjan @ gmail . com >
2019-12-19 15:16:31 +03:00
* @ author Daniel Kesselberg < mail @ danielkesselberg . de >
2019-12-03 21:57:53 +03:00
* @ author Georg Ehrke < oc . list @ georgehrke . com >
2016-07-21 18:07:57 +03:00
* @ author Joas Schilling < coding @ schilljs . com >
2017-11-06 17:56:42 +03:00
* @ author John Molakvoæ ( skjnldsv ) < skjnldsv @ protonmail . com >
2019-12-03 21:57:53 +03:00
* @ author Jörn Friedrich Dreyer < jfd @ butonic . de >
2017-11-06 17:56:42 +03:00
* @ author Julius Haertl < jus @ bitgrid . net >
* @ author Julius Härtl < jus @ bitgrid . net >
2020-09-07 15:37:44 +03:00
* @ author Lionel Elie Mamane < lionel @ mamane . lu >
2016-05-26 20:56:05 +03:00
* @ author Lukas Reschke < lukas @ statuscode . ch >
2019-12-03 21:57:53 +03:00
* @ author Maxence Lange < maxence @ artificial - owl . com >
* @ author Michael Weimann < mail @ michael - weimann . eu >
2015-03-26 13:44:34 +03:00
* @ author Morris Jobke < hey @ morrisjobke . de >
2017-11-06 17:56:42 +03:00
* @ author Piotr Mrówczyński < mrow4a @ yahoo . com >
2016-07-21 19:13:36 +03:00
* @ author Robin Appelman < robin @ icewind . nl >
2016-01-12 17:02:16 +03:00
* @ author Robin McCorkell < robin @ mccorkell . me . uk >
2016-07-21 18:07:57 +03:00
* @ author Roeland Jago Douma < roeland @ famdouma . nl >
2017-11-06 17:56:42 +03:00
* @ author root < root @ localhost . localdomain >
2015-03-26 13:44:34 +03:00
* @ author Thomas Müller < thomas . mueller @ tmit . eu >
* @ author Thomas Tanghus < thomas @ tanghus . net >
2019-12-03 21:57:53 +03:00
* @ author Tobia De Koninck < tobia @ ledfan . be >
2015-03-26 13:44:34 +03:00
* @ author Vincent Petry < pvince81 @ owncloud . com >
2019-12-03 21:57:53 +03:00
* @ author Xheni Myrtaj < myrtajxheni @ gmail . com >
2015-03-26 13:44:34 +03:00
*
* @ license AGPL - 3.0
*
* This code is free software : you can redistribute it and / or modify
* it under the terms of the GNU Affero General Public License , version 3 ,
* as published by the Free Software Foundation .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU Affero General Public License for more details .
*
* You should have received a copy of the GNU Affero General Public License , version 3 ,
2019-12-03 21:57:53 +03:00
* along with this program . If not , see < http :// www . gnu . org / licenses />
2015-03-26 13:44:34 +03:00
*
*/
2017-08-24 17:21:50 +03:00
2013-08-21 02:58:15 +04:00
namespace OC ;
2014-12-05 21:56:29 +03:00
use bantu\IniGetWrapper\IniGetWrapper ;
2017-05-16 03:46:42 +03:00
use OC\Accounts\AccountManager ;
2017-03-20 12:16:56 +03:00
use OC\App\AppManager ;
2017-04-23 23:10:17 +03:00
use OC\App\AppStore\Bundles\BundleFetcher ;
2016-10-31 13:07:54 +03:00
use OC\App\AppStore\Fetcher\AppFetcher ;
use OC\App\AppStore\Fetcher\CategoryFetcher ;
2013-09-05 01:45:11 +04:00
use OC\AppFramework\Http\Request ;
2017-03-21 12:00:02 +03:00
use OC\AppFramework\Utility\SimpleContainer ;
2015-08-21 19:27:52 +03:00
use OC\AppFramework\Utility\TimeFactory ;
2020-03-07 18:18:21 +03:00
use OC\Authentication\Events\LoginFailed ;
use OC\Authentication\Listeners\LoginFailedListener ;
2020-08-31 20:45:40 +03:00
use OC\Authentication\Listeners\UserLoggedInListener ;
2016-11-08 11:15:02 +03:00
use OC\Authentication\LoginCredentials\Store ;
2018-01-26 01:16:13 +03:00
use OC\Authentication\Token\IProvider ;
2019-01-20 13:13:41 +03:00
use OC\Avatar\AvatarManager ;
2017-09-13 15:29:57 +03:00
use OC\Collaboration\Collaborators\GroupPlugin ;
use OC\Collaboration\Collaborators\MailPlugin ;
2018-07-02 12:29:03 +03:00
use OC\Collaboration\Collaborators\RemoteGroupPlugin ;
2017-09-13 15:29:57 +03:00
use OC\Collaboration\Collaborators\RemotePlugin ;
use OC\Collaboration\Collaborators\UserPlugin ;
2017-08-24 17:06:37 +03:00
use OC\Command\CronBus ;
2018-01-26 01:16:13 +03:00
use OC\Comments\ManagerFactory as CommentsManagerFactory ;
2017-01-24 09:47:14 +03:00
use OC\Contacts\ContactsMenu\ActionFactory ;
2017-09-16 14:42:46 +03:00
use OC\Contacts\ContactsMenu\ContactsStore ;
2019-07-03 13:02:31 +03:00
use OC\Dashboard\DashboardManager ;
2014-10-03 22:39:09 +04:00
use OC\Diagnostics\EventLogger ;
use OC\Diagnostics\QueryLogger ;
2018-04-18 17:05:11 +03:00
use OC\Federation\CloudFederationFactory ;
use OC\Federation\CloudFederationProviderManager ;
2017-01-27 14:52:17 +03:00
use OC\Federation\CloudIdManager ;
2015-11-26 19:47:53 +03:00
use OC\Files\Config\UserMountCache ;
2015-12-03 16:10:05 +03:00
use OC\Files\Config\UserMountCacheListener ;
2016-04-21 15:48:08 +03:00
use OC\Files\Mount\CacheMountProvider ;
2016-05-17 22:40:55 +03:00
use OC\Files\Mount\LocalHomeMountProvider ;
use OC\Files\Mount\ObjectHomeMountProvider ;
2020-07-30 23:09:19 +03:00
use OC\Files\Mount\ObjectStorePreviewCacheMountProvider ;
2015-09-28 18:17:44 +03:00
use OC\Files\Node\HookConnector ;
2016-03-11 16:00:36 +03:00
use OC\Files\Node\LazyRoot ;
2015-06-11 12:29:27 +03:00
use OC\Files\Node\Root ;
2018-09-19 20:02:15 +03:00
use OC\Files\Storage\StorageFactory ;
2020-08-11 23:38:14 +03:00
use OC\Files\Type\Loader ;
2015-06-11 12:29:27 +03:00
use OC\Files\View ;
2018-10-30 20:24:15 +03:00
use OC\FullTextSearch\FullTextSearchManager ;
2015-06-11 12:29:27 +03:00
use OC\Http\Client\ClientService ;
Add code integrity check
This PR implements the base foundation of the code signing and integrity check. In this PR implemented is the signing and verification logic, as well as commands to sign single apps or the core repository.
Furthermore, there is a basic implementation to display problems with the code integrity on the update screen.
Code signing basically happens the following way:
- There is a ownCloud Root Certificate authority stored `resources/codesigning/root.crt` (in this PR I also ship the private key which we obviously need to change before a release :wink:). This certificate is not intended to be used for signing directly and only is used to sign new certificates.
- Using the `integrity:sign-core` and `integrity:sign-app` commands developers can sign either the core release or a single app. The core release needs to be signed with a certificate that has a CN of `core`, apps need to be signed with a certificate that either has a CN of `core` (shipped apps!) or the AppID.
- The command generates a signature.json file of the following format:
```json
{
"hashes": {
"/filename.php": "2401fed2eea6f2c1027c482a633e8e25cd46701f811e2d2c10dc213fd95fa60e350bccbbebdccc73a042b1a2799f673fbabadc783284cc288e4f1a1eacb74e3d",
"/lib/base.php": "55548cc16b457cd74241990cc9d3b72b6335f2e5f45eee95171da024087d114fcbc2effc3d5818a6d5d55f2ae960ab39fd0414d0c542b72a3b9e08eb21206dd9"
},
"certificate": "-----BEGIN CERTIFICATE-----MIIBvTCCASagAwIBAgIUPvawyqJwCwYazcv7iz16TWxfeUMwDQYJKoZIhvcNAQEF\nBQAwIzEhMB8GA1UECgwYb3duQ2xvdWQgQ29kZSBTaWduaW5nIENBMB4XDTE1MTAx\nNDEzMTcxMFoXDTE2MTAxNDEzMTcxMFowEzERMA8GA1UEAwwIY29udGFjdHMwgZ8w\nDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANoQesGdCW0L2L+a2xITYipixkScrIpB\nkX5Snu3fs45MscDb61xByjBSlFgR4QI6McoCipPw4SUr28EaExVvgPSvqUjYLGps\nfiv0Cvgquzbx/X3mUcdk9LcFo1uWGtrTfkuXSKX41PnJGTr6RQWGIBd1V52q1qbC\nJKkfzyeMeuQfAgMBAAEwDQYJKoZIhvcNAQEFBQADgYEAvF/KIhRMQ3tYTmgHWsiM\nwDMgIDb7iaHF0fS+/Nvo4PzoTO/trev6tMyjLbJ7hgdCpz/1sNzE11Cibf6V6dsz\njCE9invP368Xv0bTRObRqeSNsGogGl5ceAvR0c9BG+NRIKHcly3At3gLkS2791bC\niG+UxI/MNcWV0uJg9S63LF8=\n-----END CERTIFICATE-----",
"signature": "U29tZVNpZ25lZERhdGFFeGFtcGxl"
}
```
`hashes` is an array of all files in the folder with their corresponding SHA512 hashes (this is actually quite cheap to calculate), the `certificate` is the certificate used for signing. It has to be issued by the ownCloud Root Authority and it's CN needs to be permitted to perform the required action. The `signature` is then a signature of the `hashes` which can be verified using the `certificate`.
Steps to do in other PRs, this is already a quite huge one:
- Add nag screen in case the code check fails to ensure that administrators are aware of this.
- Add code verification also to OCC upgrade and unify display code more.
- Add enforced code verification to apps shipped from the appstore with a level of "official"
- Add enfocrced code verification to apps shipped from the appstore that were already signed in a previous release
- Add some developer documentation on how devs can request their own certificate
- Check when installing ownCloud
- Add support for CRLs to allow revoking certificates
**Note:** The upgrade checks are only run when the instance has a defined release channel of `stable` (defined in `version.php`). If you want to test this, you need to change the channel thus and then generate the core signature:
```
➜ master git:(add-integrity-checker) ✗ ./occ integrity:sign-core --privateKey=resources/codesigning/core.key --certificate=resources/codesigning/core.crt
Successfully signed "core"
```
Then increase the version and you should see something like the following:
![2015-11-04_12-02-57](https://cloud.githubusercontent.com/assets/878997/10936336/6adb1d14-82ec-11e5-8f06-9a74801c9abf.png)
As you can see a failed code check will not prevent the further update. It will instead just be a notice to the admin. In a next step we will add some nag screen.
For packaging stable releases this requires the following additional steps as a last action before zipping:
1. Run `./occ integrity:sign-core` once
2. Run `./occ integrity:sign-app` _for each_ app. However, this can be simply automated using a simple foreach on the apps folder.
2015-11-03 22:26:06 +03:00
use OC\IntegrityCheck\Checker ;
use OC\IntegrityCheck\Helpers\AppLocator ;
use OC\IntegrityCheck\Helpers\EnvironmentHelper ;
use OC\IntegrityCheck\Helpers\FileAccessHelper ;
2015-07-15 17:14:48 +03:00
use OC\Lock\DBLockingProvider ;
2015-05-04 15:02:27 +03:00
use OC\Lock\MemcacheLockingProvider ;
2015-05-21 17:11:10 +03:00
use OC\Lock\NoopLockingProvider ;
2016-08-01 19:27:07 +03:00
use OC\Lockdown\LockdownManager ;
2018-04-24 23:14:00 +03:00
use OC\Log\LogFactory ;
2019-12-03 12:16:28 +03:00
use OC\Log\PsrLoggerAdapter ;
2015-02-12 15:53:27 +03:00
use OC\Mail\Mailer ;
2016-03-31 00:20:37 +03:00
use OC\Memcache\ArrayCache ;
2017-03-20 12:16:56 +03:00
use OC\Memcache\Factory ;
2015-08-31 13:24:37 +03:00
use OC\Notification\Manager ;
2017-02-24 14:50:43 +03:00
use OC\OCS\DiscoveryService ;
2019-07-03 13:02:31 +03:00
use OC\Preview\GeneratorHelper ;
2017-10-04 17:21:50 +03:00
use OC\Remote\Api\ApiFactory ;
use OC\Remote\InstanceFactory ;
2016-11-08 17:56:39 +03:00
use OC\RichObjectStrings\Validator ;
2016-07-20 19:36:15 +03:00
use OC\Security\Bruteforce\Throttler ;
2014-08-18 18:30:23 +04:00
use OC\Security\CertificateManager ;
2019-07-03 13:02:31 +03:00
use OC\Security\CredentialsManager ;
2014-08-26 21:02:40 +04:00
use OC\Security\Crypto ;
2020-03-18 12:43:54 +03:00
use OC\Security\CSP\ContentSecurityPolicyManager ;
2016-10-24 17:31:06 +03:00
use OC\Security\CSP\ContentSecurityPolicyNonceManager ;
2016-01-25 19:15:54 +03:00
use OC\Security\CSRF\CsrfTokenManager ;
use OC\Security\CSRF\TokenStorage\SessionStorage ;
2014-11-04 18:05:31 +03:00
use OC\Security\Hasher ;
2014-08-26 21:02:40 +04:00
use OC\Security\SecureRandom ;
2015-02-17 00:12:47 +03:00
use OC\Security\TrustedDomainHelper ;
2015-07-20 13:59:04 +03:00
use OC\Session\CryptoWrapper ;
2018-01-26 01:16:13 +03:00
use OC\Share20\ProviderFactory ;
2017-03-20 16:22:06 +03:00
use OC\Share20\ShareHelper ;
2018-01-26 01:16:13 +03:00
use OC\SystemTag\ManagerFactory as SystemTagManagerFactory ;
2014-09-08 21:58:43 +04:00
use OC\Tagging\TagMapper ;
2018-01-26 19:46:42 +03:00
use OC\Template\JSCombiner ;
2018-02-26 15:54:00 +03:00
use OCA\Theming\ImageManager ;
2016-08-12 16:30:35 +03:00
use OCA\Theming\ThemingDefaults ;
2019-07-03 13:02:31 +03:00
use OCA\Theming\Util ;
2018-10-24 13:53:43 +03:00
use OCP\Accounts\IAccountManager ;
2017-03-20 12:16:56 +03:00
use OCP\App\IAppManager ;
2019-07-03 13:02:31 +03:00
use OCP\Authentication\LoginCredentials\IStore ;
2020-03-18 12:43:54 +03:00
use OCP\BackgroundJob\IJobList ;
2017-10-31 15:55:03 +03:00
use OCP\Collaboration\AutoComplete\IManager ;
2020-07-02 18:28:27 +03:00
use OCP\Command\IBus ;
2020-03-18 12:43:54 +03:00
use OCP\Comments\ICommentsManager ;
2019-07-03 13:02:31 +03:00
use OCP\Contacts\ContactsMenu\IActionFactory ;
2017-12-10 13:58:33 +03:00
use OCP\Contacts\ContactsMenu\IContactsStore ;
2018-10-15 20:25:09 +03:00
use OCP\Dashboard\IDashboardManager ;
2017-04-07 23:42:43 +03:00
use OCP\Defaults ;
2020-03-18 12:43:54 +03:00
use OCP\Diagnostics\IEventLogger ;
use OCP\Diagnostics\IQueryLogger ;
2019-07-27 13:56:27 +03:00
use OCP\EventDispatcher\IEventDispatcher ;
2018-04-18 17:05:11 +03:00
use OCP\Federation\ICloudFederationFactory ;
use OCP\Federation\ICloudFederationProviderManager ;
2017-01-27 14:52:17 +03:00
use OCP\Federation\ICloudIdManager ;
2020-03-18 12:43:54 +03:00
use OCP\Files\Config\IMountProviderCollection ;
use OCP\Files\Config\IUserMountCache ;
use OCP\Files\IMimeTypeDetector ;
use OCP\Files\IMimeTypeLoader ;
use OCP\Files\IRootFolder ;
use OCP\Files\Mount\IMountManager ;
2017-12-11 18:39:44 +03:00
use OCP\Files\NotFoundException ;
2018-09-19 20:02:15 +03:00
use OCP\Files\Storage\IStorageFactory ;
2018-10-30 20:24:15 +03:00
use OCP\FullTextSearch\IFullTextSearchManager ;
2018-04-18 17:05:11 +03:00
use OCP\GlobalScale\IConfig ;
2019-12-11 12:20:36 +03:00
use OCP\Group\Events\BeforeGroupCreatedEvent ;
use OCP\Group\Events\BeforeGroupDeletedEvent ;
use OCP\Group\Events\BeforeUserAddedEvent ;
use OCP\Group\Events\BeforeUserRemovedEvent ;
use OCP\Group\Events\GroupCreatedEvent ;
use OCP\Group\Events\GroupDeletedEvent ;
use OCP\Group\Events\UserAddedEvent ;
use OCP\Group\Events\UserRemovedEvent ;
2019-01-29 12:38:05 +03:00
use OCP\Group\ISubAdmin ;
2020-03-18 12:43:54 +03:00
use OCP\Http\Client\IClientService ;
use OCP\IAppConfig ;
use OCP\IAvatarManager ;
use OCP\ICache ;
2017-03-20 12:16:56 +03:00
use OCP\ICacheFactory ;
2020-03-18 12:43:54 +03:00
use OCP\IDateTimeFormatter ;
use OCP\IDateTimeZone ;
2017-03-20 01:14:47 +03:00
use OCP\IDBConnection ;
2020-03-18 12:43:54 +03:00
use OCP\IGroupManager ;
2019-01-17 14:30:47 +03:00
use OCP\IInitialStateService ;
2016-04-14 16:38:00 +03:00
use OCP\IL10N ;
2020-02-07 13:37:04 +03:00
use OCP\ILogger ;
2020-03-18 12:43:54 +03:00
use OCP\INavigationManager ;
use OCP\IPreview ;
use OCP\IRequest ;
use OCP\ISearch ;
2015-06-11 12:29:27 +03:00
use OCP\IServerContainer ;
2020-03-18 12:43:54 +03:00
use OCP\ITagManager ;
2017-03-20 12:16:56 +03:00
use OCP\ITempManager ;
2020-03-18 12:43:54 +03:00
use OCP\IURLGenerator ;
2017-09-27 14:17:34 +03:00
use OCP\IUser ;
2020-03-18 12:43:54 +03:00
use OCP\IUserManager ;
use OCP\IUserSession ;
use OCP\L10N\IFactory ;
2017-07-22 14:46:09 +03:00
use OCP\Lock\ILockingProvider ;
2018-04-25 03:27:43 +03:00
use OCP\Log\ILogFactory ;
2020-03-18 12:43:54 +03:00
use OCP\Mail\IMailer ;
2017-10-04 17:21:50 +03:00
use OCP\Remote\Api\IApiFactory ;
use OCP\Remote\IInstanceFactory ;
2016-11-10 17:33:00 +03:00
use OCP\RichObjectStrings\IValidator ;
2020-03-18 12:43:54 +03:00
use OCP\Route\IRouter ;
2016-01-28 16:33:02 +03:00
use OCP\Security\IContentSecurityPolicyManager ;
2020-03-18 12:43:54 +03:00
use OCP\Security\ICredentialsManager ;
use OCP\Security\ICrypto ;
use OCP\Security\IHasher ;
use OCP\Security\ISecureRandom ;
2017-03-20 16:22:06 +03:00
use OCP\Share\IShareHelper ;
2020-03-18 12:43:54 +03:00
use OCP\SystemTag\ISystemTagManager ;
use OCP\SystemTag\ISystemTagObjectMapper ;
2019-12-11 11:38:23 +03:00
use OCP\User\Events\BeforePasswordUpdatedEvent ;
use OCP\User\Events\BeforeUserCreatedEvent ;
use OCP\User\Events\BeforeUserDeletedEvent ;
use OCP\User\Events\BeforeUserLoggedInEvent ;
use OCP\User\Events\BeforeUserLoggedInWithCookieEvent ;
use OCP\User\Events\BeforeUserLoggedOutEvent ;
use OCP\User\Events\PasswordUpdatedEvent ;
2020-08-31 20:45:40 +03:00
use OCP\User\Events\PostLoginEvent ;
2019-12-11 11:38:23 +03:00
use OCP\User\Events\UserChangedEvent ;
use OCP\User\Events\UserDeletedEvent ;
use OCP\User\Events\UserLoggedInEvent ;
use OCP\User\Events\UserLoggedInWithCookieEvent ;
use OCP\User\Events\UserLoggedOutEvent ;
2020-07-13 12:18:14 +03:00
use Psr\Container\ContainerExceptionInterface ;
use Psr\Container\ContainerInterface ;
2019-12-03 12:16:28 +03:00
use Psr\Log\LoggerInterface ;
2015-08-14 16:40:15 +03:00
use Symfony\Component\EventDispatcher\EventDispatcherInterface ;
2017-09-27 13:53:56 +03:00
use Symfony\Component\EventDispatcher\GenericEvent ;
2020-03-18 12:43:54 +03:00
use OCA\Files_External\Service\UserStoragesService ;
use OCA\Files_External\Service\UserGlobalStoragesService ;
use OCA\Files_External\Service\GlobalStoragesService ;
use OCA\Files_External\Service\BackendService ;
2013-08-21 02:58:15 +04:00
/**
* Class Server
2014-07-16 16:25:31 +04:00
*
2013-08-21 02:58:15 +04:00
* @ package OC
*
* TODO : hookup all manager classes
*/
2015-12-18 13:43:39 +03:00
class Server extends ServerContainer implements IServerContainer {
2020-07-13 12:18:14 +03:00
2014-11-27 16:50:14 +03:00
/** @var string */
private $webRoot ;
/**
* @ param string $webRoot
2015-12-18 13:24:15 +03:00
* @ param \OC\Config $config
2014-11-27 16:50:14 +03:00
*/
2015-12-18 13:24:15 +03:00
public function __construct ( $webRoot , \OC\Config $config ) {
2015-07-24 14:43:50 +03:00
parent :: __construct ();
2014-11-27 16:50:14 +03:00
$this -> webRoot = $webRoot ;
2018-05-08 14:32:37 +03:00
// To find out if we are running from CLI or not
$this -> registerParameter ( 'isCLI' , \OC :: $CLI );
2020-08-11 23:38:14 +03:00
$this -> registerParameter ( 'serverRoot' , \OC :: $SERVERROOT );
2018-05-08 14:32:37 +03:00
2020-07-13 12:18:14 +03:00
$this -> registerService ( ContainerInterface :: class , function ( ContainerInterface $c ) {
return $c ;
});
$this -> registerService ( \OCP\IServerContainer :: class , function ( ContainerInterface $c ) {
2017-01-24 09:47:14 +03:00
return $c ;
});
2017-10-31 19:06:01 +03:00
$this -> registerAlias ( \OCP\Calendar\IManager :: class , \OC\Calendar\Manager :: class );
2020-08-13 08:43:37 +03:00
/** @deprecated 19.0.0 */
2020-02-07 13:39:55 +03:00
$this -> registerDeprecatedAlias ( 'CalendarManager' , \OC\Calendar\Manager :: class );
2017-10-31 19:06:01 +03:00
2018-06-18 15:33:25 +03:00
$this -> registerAlias ( \OCP\Calendar\Resource\IManager :: class , \OC\Calendar\Resource\Manager :: class );
2020-08-13 08:43:37 +03:00
/** @deprecated 19.0.0 */
2020-02-07 13:39:55 +03:00
$this -> registerDeprecatedAlias ( 'CalendarResourceBackendManager' , \OC\Calendar\Resource\Manager :: class );
2018-06-18 15:33:25 +03:00
$this -> registerAlias ( \OCP\Calendar\Room\IManager :: class , \OC\Calendar\Room\Manager :: class );
2020-08-13 08:43:37 +03:00
/** @deprecated 19.0.0 */
2020-02-07 13:39:55 +03:00
$this -> registerDeprecatedAlias ( 'CalendarRoomBackendManager' , \OC\Calendar\Room\Manager :: class );
2018-06-18 15:33:25 +03:00
2017-03-21 12:00:02 +03:00
$this -> registerAlias ( \OCP\Contacts\IManager :: class , \OC\ContactsManager :: class );
2020-08-13 08:43:37 +03:00
/** @deprecated 19.0.0 */
2020-02-07 13:39:55 +03:00
$this -> registerDeprecatedAlias ( 'ContactsManager' , \OCP\Contacts\IManager :: class );
2015-01-14 22:39:23 +03:00
2019-10-14 17:55:39 +03:00
$this -> registerAlias ( \OCP\DirectEditing\IManager :: class , \OC\DirectEditing\Manager :: class );
2017-01-24 09:47:14 +03:00
$this -> registerAlias ( IActionFactory :: class , ActionFactory :: class );
2020-03-18 12:43:54 +03:00
$this -> registerService ( IPreview :: class , function ( Server $c ) {
2016-10-16 17:48:11 +03:00
return new PreviewManager (
$c -> getConfig (),
$c -> getRootFolder (),
2020-08-14 21:19:23 +03:00
new \OC\Preview\Storage\Root ( $c -> getRootFolder (), $c -> getSystemConfig ()),
2017-01-04 18:51:44 +03:00
$c -> getEventDispatcher (),
2019-07-03 13:02:31 +03:00
$c -> getGeneratorHelper (),
2017-01-04 18:51:44 +03:00
$c -> getSession () -> get ( 'user_id' )
2016-10-16 17:48:11 +03:00
);
2013-09-05 01:45:11 +04:00
});
2020-08-13 08:43:37 +03:00
/** @deprecated 19.0.0 */
2020-03-18 12:43:54 +03:00
$this -> registerDeprecatedAlias ( 'PreviewManager' , IPreview :: class );
2015-01-14 22:39:23 +03:00
2016-10-14 16:09:51 +03:00
$this -> registerService ( \OC\Preview\Watcher :: class , function ( Server $c ) {
return new \OC\Preview\Watcher (
2020-08-14 21:19:23 +03:00
new \OC\Preview\Storage\Root ( $c -> getRootFolder (), $c -> getSystemConfig ())
2016-10-14 16:09:51 +03:00
);
});
2018-11-01 12:48:27 +03:00
$this -> registerService ( \OCP\Encryption\IManager :: class , function ( Server $c ) {
2015-07-24 13:24:18 +03:00
$view = new View ();
$util = new Encryption\Util (
$view ,
$c -> getUserManager (),
$c -> getGroupManager (),
$c -> getConfig ()
);
return new Encryption\Manager (
$c -> getConfig (),
$c -> getLogger (),
$c -> getL10N ( 'core' ),
new View (),
2016-03-31 00:20:37 +03:00
$util ,
new ArrayCache ()
2015-07-24 13:24:18 +03:00
);
2015-01-14 22:39:23 +03:00
});
2020-08-13 08:43:37 +03:00
/** @deprecated 19.0.0 */
2020-02-07 13:39:55 +03:00
$this -> registerDeprecatedAlias ( 'EncryptionManager' , \OCP\Encryption\IManager :: class );
2015-01-14 22:39:23 +03:00
2015-03-31 17:23:31 +03:00
$this -> registerService ( 'EncryptionFileHelper' , function ( Server $c ) {
2015-07-24 13:24:18 +03:00
$util = new Encryption\Util (
new View (),
2015-04-15 14:19:17 +03:00
$c -> getUserManager (),
$c -> getGroupManager (),
$c -> getConfig ()
);
2016-10-19 22:27:34 +03:00
return new Encryption\File (
$util ,
$c -> getRootFolder (),
$c -> getShareManager ()
);
2015-03-31 17:23:31 +03:00
});
2015-04-22 12:18:18 +03:00
$this -> registerService ( 'EncryptionKeyStorage' , function ( Server $c ) {
2015-07-24 13:24:18 +03:00
$view = new View ();
$util = new Encryption\Util (
2015-04-22 12:18:18 +03:00
$view ,
$c -> getUserManager (),
$c -> getGroupManager (),
$c -> getConfig ()
);
2020-06-22 16:35:52 +03:00
return new Encryption\Keys\Storage ( $view , $util , $c -> getCrypto (), $c -> getConfig ());
2015-01-14 22:39:23 +03:00
});
2020-08-13 08:43:37 +03:00
/** @deprecated 20.0.0 */
2020-08-12 23:46:32 +03:00
$this -> registerDeprecatedAlias ( 'TagMapper' , TagMapper :: class );
2017-03-21 12:00:02 +03:00
2020-08-11 23:38:14 +03:00
$this -> registerAlias ( \OCP\ITagManager :: class , TagManager :: class );
2020-08-13 08:43:37 +03:00
/** @deprecated 19.0.0 */
2020-02-07 13:39:55 +03:00
$this -> registerDeprecatedAlias ( 'TagManager' , \OCP\ITagManager :: class );
2017-03-21 12:00:02 +03:00
2016-01-19 18:17:49 +03:00
$this -> registerService ( 'SystemTagManagerFactory' , function ( Server $c ) {
$config = $c -> getConfig ();
2018-01-26 01:16:13 +03:00
$factoryClass = $config -> getSystemValue ( 'systemtags.managerFactory' , SystemTagManagerFactory :: class );
2018-01-26 02:02:03 +03:00
return new $factoryClass ( $this );
2016-01-19 18:17:49 +03:00
});
2020-03-18 12:43:54 +03:00
$this -> registerService ( ISystemTagManager :: class , function ( Server $c ) {
2016-01-19 18:17:49 +03:00
return $c -> query ( 'SystemTagManagerFactory' ) -> getManager ();
2015-11-26 17:49:14 +03:00
});
2020-08-13 08:43:37 +03:00
/** @deprecated 19.0.0 */
2020-03-18 12:43:54 +03:00
$this -> registerDeprecatedAlias ( 'SystemTagManager' , ISystemTagManager :: class );
2017-03-21 12:00:02 +03:00
2020-03-18 12:43:54 +03:00
$this -> registerService ( ISystemTagObjectMapper :: class , function ( Server $c ) {
2016-01-19 18:17:49 +03:00
return $c -> query ( 'SystemTagManagerFactory' ) -> getObjectMapper ();
2015-11-26 17:49:14 +03:00
});
2016-09-18 19:36:53 +03:00
$this -> registerService ( 'RootFolder' , function ( Server $c ) {
2016-02-18 11:21:32 +03:00
$manager = \OC\Files\Filesystem :: getMountManager ( null );
2013-09-16 00:24:57 +04:00
$view = new View ();
2016-11-03 01:16:51 +03:00
$root = new Root (
$manager ,
$view ,
null ,
$c -> getUserMountCache (),
$this -> getLogger (),
$this -> getUserManager ()
);
2016-10-14 16:09:51 +03:00
$previewConnector = new \OC\Preview\WatcherConnector ( $root , $c -> getSystemConfig ());
$previewConnector -> connectWatcher ();
2015-09-28 18:17:44 +03:00
return $root ;
2013-09-16 00:24:57 +04:00
});
2020-04-22 16:21:15 +03:00
$this -> registerService ( HookConnector :: class , function ( Server $c ) {
return new HookConnector (
$c -> query ( IRootFolder :: class ),
new View (),
$c -> query ( \OC\EventDispatcher\SymfonyAdapter :: class ),
$c -> query ( IEventDispatcher :: class )
);
});
2020-08-13 08:43:37 +03:00
/** @deprecated 19.0.0 */
2020-03-18 12:43:54 +03:00
$this -> registerDeprecatedAlias ( 'SystemTagObjectMapper' , ISystemTagObjectMapper :: class );
2017-03-21 12:00:02 +03:00
2020-03-18 12:43:54 +03:00
$this -> registerService ( IRootFolder :: class , function ( Server $c ) {
2017-08-24 17:21:50 +03:00
return new LazyRoot ( function () use ( $c ) {
2016-08-26 13:13:34 +03:00
return $c -> query ( 'RootFolder' );
2016-03-11 16:00:36 +03:00
});
});
2020-08-13 08:43:37 +03:00
/** @deprecated 19.0.0 */
2020-03-18 12:43:54 +03:00
$this -> registerDeprecatedAlias ( 'LazyRootFolder' , IRootFolder :: class );
2017-03-21 12:00:02 +03:00
2020-08-13 08:43:37 +03:00
/** @deprecated 19.0.0 */
2020-02-07 13:39:55 +03:00
$this -> registerDeprecatedAlias ( 'UserManager' , \OC\User\Manager :: class );
2018-01-13 22:36:02 +03:00
$this -> registerAlias ( \OCP\IUserManager :: class , \OC\User\Manager :: class );
2017-03-21 12:00:02 +03:00
$this -> registerService ( \OCP\IGroupManager :: class , function ( Server $c ) {
2019-02-22 15:07:26 +03:00
$groupManager = new \OC\Group\Manager ( $this -> getUserManager (), $c -> getEventDispatcher (), $this -> getLogger ());
2014-12-04 16:15:55 +03:00
$groupManager -> listen ( '\OC\Group' , 'preCreate' , function ( $gid ) {
2020-03-26 11:30:18 +03:00
\OC_Hook :: emit ( 'OC_Group' , 'pre_createGroup' , [ 'run' => true , 'gid' => $gid ]);
2019-12-11 12:20:36 +03:00
/** @var IEventDispatcher $dispatcher */
$dispatcher = $this -> query ( IEventDispatcher :: class );
$dispatcher -> dispatchTyped ( new BeforeGroupCreatedEvent ( $gid ));
2014-12-04 16:15:55 +03:00
});
2019-12-11 12:20:36 +03:00
$groupManager -> listen ( '\OC\Group' , 'postCreate' , function ( \OC\Group\Group $group ) {
2020-03-26 11:30:18 +03:00
\OC_Hook :: emit ( 'OC_User' , 'post_createGroup' , [ 'gid' => $group -> getGID ()]);
2019-12-11 12:20:36 +03:00
/** @var IEventDispatcher $dispatcher */
$dispatcher = $this -> query ( IEventDispatcher :: class );
$dispatcher -> dispatchTyped ( new GroupCreatedEvent ( $group ));
2014-12-04 16:15:55 +03:00
});
$groupManager -> listen ( '\OC\Group' , 'preDelete' , function ( \OC\Group\Group $group ) {
2020-03-26 11:30:18 +03:00
\OC_Hook :: emit ( 'OC_Group' , 'pre_deleteGroup' , [ 'run' => true , 'gid' => $group -> getGID ()]);
2019-12-11 12:20:36 +03:00
/** @var IEventDispatcher $dispatcher */
$dispatcher = $this -> query ( IEventDispatcher :: class );
$dispatcher -> dispatchTyped ( new BeforeGroupDeletedEvent ( $group ));
2014-12-04 16:15:55 +03:00
});
$groupManager -> listen ( '\OC\Group' , 'postDelete' , function ( \OC\Group\Group $group ) {
2020-03-26 11:30:18 +03:00
\OC_Hook :: emit ( 'OC_User' , 'post_deleteGroup' , [ 'gid' => $group -> getGID ()]);
2019-12-11 12:20:36 +03:00
/** @var IEventDispatcher $dispatcher */
$dispatcher = $this -> query ( IEventDispatcher :: class );
$dispatcher -> dispatchTyped ( new GroupDeletedEvent ( $group ));
2014-12-04 16:15:55 +03:00
});
$groupManager -> listen ( '\OC\Group' , 'preAddUser' , function ( \OC\Group\Group $group , \OC\User\User $user ) {
2020-03-26 11:30:18 +03:00
\OC_Hook :: emit ( 'OC_Group' , 'pre_addToGroup' , [ 'run' => true , 'uid' => $user -> getUID (), 'gid' => $group -> getGID ()]);
2019-12-11 12:20:36 +03:00
/** @var IEventDispatcher $dispatcher */
$dispatcher = $this -> query ( IEventDispatcher :: class );
$dispatcher -> dispatchTyped ( new BeforeUserAddedEvent ( $group , $user ));
2014-12-04 16:15:55 +03:00
});
$groupManager -> listen ( '\OC\Group' , 'postAddUser' , function ( \OC\Group\Group $group , \OC\User\User $user ) {
2020-03-26 11:30:18 +03:00
\OC_Hook :: emit ( 'OC_Group' , 'post_addToGroup' , [ 'uid' => $user -> getUID (), 'gid' => $group -> getGID ()]);
2015-07-02 17:25:11 +03:00
//Minimal fix to keep it backward compatible TODO: clean up all the GroupManager hooks
2020-03-26 11:30:18 +03:00
\OC_Hook :: emit ( 'OC_User' , 'post_addToGroup' , [ 'uid' => $user -> getUID (), 'gid' => $group -> getGID ()]);
2019-12-11 12:20:36 +03:00
/** @var IEventDispatcher $dispatcher */
$dispatcher = $this -> query ( IEventDispatcher :: class );
$dispatcher -> dispatchTyped ( new UserAddedEvent ( $group , $user ));
});
$groupManager -> listen ( '\OC\Group' , 'preRemoveUser' , function ( \OC\Group\Group $group , \OC\User\User $user ) {
/** @var IEventDispatcher $dispatcher */
$dispatcher = $this -> query ( IEventDispatcher :: class );
$dispatcher -> dispatchTyped ( new BeforeUserRemovedEvent ( $group , $user ));
});
$groupManager -> listen ( '\OC\Group' , 'postRemoveUser' , function ( \OC\Group\Group $group , \OC\User\User $user ) {
/** @var IEventDispatcher $dispatcher */
$dispatcher = $this -> query ( IEventDispatcher :: class );
$dispatcher -> dispatchTyped ( new UserRemovedEvent ( $group , $user ));
2014-12-04 16:15:55 +03:00
});
return $groupManager ;
2014-07-16 16:25:31 +04:00
});
2020-08-13 08:43:37 +03:00
/** @deprecated 19.0.0 */
2020-02-07 13:39:55 +03:00
$this -> registerDeprecatedAlias ( 'GroupManager' , \OCP\IGroupManager :: class );
2017-03-21 12:00:02 +03:00
2017-08-24 17:21:50 +03:00
$this -> registerService ( Store :: class , function ( Server $c ) {
2016-11-08 11:15:02 +03:00
$session = $c -> getSession ();
2017-01-02 13:57:05 +03:00
if ( \OC :: $server -> getSystemConfig () -> getValue ( 'installed' , false )) {
2018-01-26 01:16:13 +03:00
$tokenProvider = $c -> query ( IProvider :: class );
2017-01-02 13:57:05 +03:00
} else {
$tokenProvider = null ;
}
2016-11-08 11:15:02 +03:00
$logger = $c -> getLogger ();
2017-01-02 13:57:05 +03:00
return new Store ( $session , $logger , $tokenProvider );
2016-11-08 11:15:02 +03:00
});
$this -> registerAlias ( IStore :: class , Store :: class );
2018-05-15 21:03:35 +03:00
$this -> registerAlias ( IProvider :: class , Authentication\Token\Manager :: class );
2017-03-21 12:00:02 +03:00
2018-11-01 12:43:01 +03:00
$this -> registerService ( \OC\User\Session :: class , function ( Server $c ) {
2014-10-24 16:13:40 +04:00
$manager = $c -> getUserManager ();
2015-07-20 13:59:04 +03:00
$session = new \OC\Session\Memory ( '' );
2016-05-02 20:58:19 +03:00
$timeFactory = new TimeFactory ();
2016-04-27 13:01:13 +03:00
// Token providers might require a working database. This code
// might however be called when ownCloud is not yet setup.
if ( \OC :: $server -> getSystemConfig () -> getValue ( 'installed' , false )) {
2018-01-26 01:16:13 +03:00
$defaultTokenProvider = $c -> query ( IProvider :: class );
2016-04-27 13:01:13 +03:00
} else {
$defaultTokenProvider = null ;
}
2016-06-24 18:53:37 +03:00
2019-12-11 11:38:23 +03:00
$legacyDispatcher = $c -> getEventDispatcher ();
2017-09-27 13:53:56 +03:00
2018-01-23 11:41:44 +03:00
$userSession = new \OC\User\Session (
$manager ,
$session ,
$timeFactory ,
$defaultTokenProvider ,
$c -> getConfig (),
$c -> getSecureRandom (),
$c -> getLockdownManager (),
2019-07-27 13:56:27 +03:00
$c -> getLogger (),
$c -> query ( IEventDispatcher :: class )
2018-01-23 11:41:44 +03:00
);
2013-09-20 14:45:56 +04:00
$userSession -> listen ( '\OC\User' , 'preCreateUser' , function ( $uid , $password ) {
2020-03-26 11:30:18 +03:00
\OC_Hook :: emit ( 'OC_User' , 'pre_createUser' , [ 'run' => true , 'uid' => $uid , 'password' => $password ]);
2019-12-11 11:38:23 +03:00
/** @var IEventDispatcher $dispatcher */
$dispatcher = $this -> query ( IEventDispatcher :: class );
$dispatcher -> dispatchTyped ( new BeforeUserCreatedEvent ( $uid , $password ));
2013-09-20 14:45:56 +04:00
});
$userSession -> listen ( '\OC\User' , 'postCreateUser' , function ( $user , $password ) {
2020-08-14 21:19:23 +03:00
/** @var \OC\User\User $user */
2020-03-26 11:30:18 +03:00
\OC_Hook :: emit ( 'OC_User' , 'post_createUser' , [ 'uid' => $user -> getUID (), 'password' => $password ]);
2013-09-20 14:45:56 +04:00
});
2019-12-11 11:38:23 +03:00
$userSession -> listen ( '\OC\User' , 'preDelete' , function ( $user ) use ( $legacyDispatcher ) {
2020-08-14 21:19:23 +03:00
/** @var \OC\User\User $user */
2020-03-26 11:30:18 +03:00
\OC_Hook :: emit ( 'OC_User' , 'pre_deleteUser' , [ 'run' => true , 'uid' => $user -> getUID ()]);
2019-12-11 11:38:23 +03:00
$legacyDispatcher -> dispatch ( 'OCP\IUser::preDelete' , new GenericEvent ( $user ));
/** @var IEventDispatcher $dispatcher */
$dispatcher = $this -> query ( IEventDispatcher :: class );
$dispatcher -> dispatchTyped ( new BeforeUserDeletedEvent ( $user ));
2013-09-20 14:45:56 +04:00
});
$userSession -> listen ( '\OC\User' , 'postDelete' , function ( $user ) {
2020-08-14 21:19:23 +03:00
/** @var \OC\User\User $user */
2020-03-26 11:30:18 +03:00
\OC_Hook :: emit ( 'OC_User' , 'post_deleteUser' , [ 'uid' => $user -> getUID ()]);
2019-12-11 11:38:23 +03:00
/** @var IEventDispatcher $dispatcher */
$dispatcher = $this -> query ( IEventDispatcher :: class );
$dispatcher -> dispatchTyped ( new UserDeletedEvent ( $user ));
2013-09-20 14:45:56 +04:00
});
$userSession -> listen ( '\OC\User' , 'preSetPassword' , function ( $user , $password , $recoveryPassword ) {
2020-08-14 21:19:23 +03:00
/** @var \OC\User\User $user */
2020-03-26 11:30:18 +03:00
\OC_Hook :: emit ( 'OC_User' , 'pre_setPassword' , [ 'run' => true , 'uid' => $user -> getUID (), 'password' => $password , 'recoveryPassword' => $recoveryPassword ]);
2019-12-11 11:38:23 +03:00
/** @var IEventDispatcher $dispatcher */
$dispatcher = $this -> query ( IEventDispatcher :: class );
$dispatcher -> dispatchTyped ( new BeforePasswordUpdatedEvent ( $user , $password , $recoveryPassword ));
2013-09-20 14:45:56 +04:00
});
$userSession -> listen ( '\OC\User' , 'postSetPassword' , function ( $user , $password , $recoveryPassword ) {
2020-08-14 21:19:23 +03:00
/** @var \OC\User\User $user */
2020-03-26 11:30:18 +03:00
\OC_Hook :: emit ( 'OC_User' , 'post_setPassword' , [ 'run' => true , 'uid' => $user -> getUID (), 'password' => $password , 'recoveryPassword' => $recoveryPassword ]);
2019-12-11 11:38:23 +03:00
/** @var IEventDispatcher $dispatcher */
$dispatcher = $this -> query ( IEventDispatcher :: class );
$dispatcher -> dispatchTyped ( new PasswordUpdatedEvent ( $user , $password , $recoveryPassword ));
2013-09-20 14:45:56 +04:00
});
$userSession -> listen ( '\OC\User' , 'preLogin' , function ( $uid , $password ) {
2020-03-26 11:30:18 +03:00
\OC_Hook :: emit ( 'OC_User' , 'pre_login' , [ 'run' => true , 'uid' => $uid , 'password' => $password ]);
2019-12-11 11:38:23 +03:00
/** @var IEventDispatcher $dispatcher */
$dispatcher = $this -> query ( IEventDispatcher :: class );
$dispatcher -> dispatchTyped ( new BeforeUserLoggedInEvent ( $uid , $password ));
2013-09-20 14:45:56 +04:00
});
2020-06-20 12:21:41 +03:00
$userSession -> listen ( '\OC\User' , 'postLogin' , function ( $user , $loginName , $password , $isTokenLogin ) {
2020-08-14 21:19:23 +03:00
/** @var \OC\User\User $user */
2020-06-20 12:21:41 +03:00
\OC_Hook :: emit ( 'OC_User' , 'post_login' , [ 'run' => true , 'uid' => $user -> getUID (), 'loginName' => $loginName , 'password' => $password , 'isTokenLogin' => $isTokenLogin ]);
2019-12-11 11:38:23 +03:00
/** @var IEventDispatcher $dispatcher */
$dispatcher = $this -> query ( IEventDispatcher :: class );
$dispatcher -> dispatchTyped ( new UserLoggedInEvent ( $user , $password , $isTokenLogin ));
});
$userSession -> listen ( '\OC\User' , 'preRememberedLogin' , function ( $uid ) {
/** @var IEventDispatcher $dispatcher */
$dispatcher = $this -> query ( IEventDispatcher :: class );
$dispatcher -> dispatchTyped ( new BeforeUserLoggedInWithCookieEvent ( $uid ));
2013-09-20 14:45:56 +04:00
});
2017-05-16 09:41:11 +03:00
$userSession -> listen ( '\OC\User' , 'postRememberedLogin' , function ( $user , $password ) {
2020-08-17 18:16:50 +03:00
/** @var \OC\User\User $user */
2020-03-26 11:30:18 +03:00
\OC_Hook :: emit ( 'OC_User' , 'post_login' , [ 'run' => true , 'uid' => $user -> getUID (), 'password' => $password ]);
2019-12-11 11:38:23 +03:00
/** @var IEventDispatcher $dispatcher */
$dispatcher = $this -> query ( IEventDispatcher :: class );
$dispatcher -> dispatchTyped ( new UserLoggedInWithCookieEvent ( $user , $password ));
2017-05-16 09:41:11 +03:00
});
2019-12-11 11:38:23 +03:00
$userSession -> listen ( '\OC\User' , 'logout' , function ( $user ) {
2020-03-26 11:30:18 +03:00
\OC_Hook :: emit ( 'OC_User' , 'logout' , []);
2019-12-11 11:38:23 +03:00
/** @var IEventDispatcher $dispatcher */
$dispatcher = $this -> query ( IEventDispatcher :: class );
$dispatcher -> dispatchTyped ( new BeforeUserLoggedOutEvent ( $user ));
});
$userSession -> listen ( '\OC\User' , 'postLogout' , function ( $user ) {
/** @var IEventDispatcher $dispatcher */
$dispatcher = $this -> query ( IEventDispatcher :: class );
$dispatcher -> dispatchTyped ( new UserLoggedOutEvent ( $user ));
2013-09-20 14:45:56 +04:00
});
2019-04-09 12:28:33 +03:00
$userSession -> listen ( '\OC\User' , 'changeUser' , function ( $user , $feature , $value , $oldValue ) {
2020-08-14 21:19:23 +03:00
/** @var \OC\User\User $user */
2020-03-26 11:30:18 +03:00
\OC_Hook :: emit ( 'OC_User' , 'changeUser' , [ 'run' => true , 'user' => $user , 'feature' => $feature , 'value' => $value , 'old_value' => $oldValue ]);
2019-12-11 11:38:23 +03:00
/** @var IEventDispatcher $dispatcher */
$dispatcher = $this -> query ( IEventDispatcher :: class );
$dispatcher -> dispatchTyped ( new UserChangedEvent ( $user , $feature , $value , $oldValue ));
2016-01-18 22:27:43 +03:00
});
2013-09-20 14:45:56 +04:00
return $userSession ;
});
2018-11-01 12:43:01 +03:00
$this -> registerAlias ( \OCP\IUserSession :: class , \OC\User\Session :: class );
2020-08-13 08:43:37 +03:00
/** @deprecated 19.0.0 */
2020-02-07 13:39:55 +03:00
$this -> registerDeprecatedAlias ( 'UserSession' , \OC\User\Session :: class );
2016-05-11 12:23:25 +03:00
2018-05-22 09:52:16 +03:00
$this -> registerAlias ( \OCP\Authentication\TwoFactorAuth\IRegistry :: class , \OC\Authentication\TwoFactorAuth\Registry :: class );
2016-05-11 12:23:25 +03:00
2020-03-18 12:43:54 +03:00
$this -> registerAlias ( INavigationManager :: class , \OC\NavigationManager :: class );
2020-08-13 08:43:37 +03:00
/** @deprecated 19.0.0 */
2020-03-18 12:43:54 +03:00
$this -> registerDeprecatedAlias ( 'NavigationManager' , INavigationManager :: class );
2017-03-17 16:30:46 +03:00
2020-08-13 08:43:37 +03:00
/** @deprecated 19.0.0 */
2020-02-07 13:39:55 +03:00
$this -> registerDeprecatedAlias ( 'AllConfig' , \OC\AllConfig :: class );
2017-03-17 16:30:46 +03:00
$this -> registerAlias ( \OCP\IConfig :: class , \OC\AllConfig :: class );
2019-08-12 18:54:27 +03:00
$this -> registerService ( \OC\SystemConfig :: class , function ( $c ) use ( $config ) {
2015-12-18 13:24:15 +03:00
return new \OC\SystemConfig ( $config );
2013-09-20 22:21:24 +04:00
});
2020-08-13 08:43:37 +03:00
/** @deprecated 19.0.0 */
2020-02-07 13:39:55 +03:00
$this -> registerDeprecatedAlias ( 'SystemConfig' , \OC\SystemConfig :: class );
2017-03-17 16:30:46 +03:00
2020-08-13 08:43:37 +03:00
/** @deprecated 19.0.0 */
2020-02-07 13:39:55 +03:00
$this -> registerDeprecatedAlias ( 'AppConfig' , \OC\AppConfig :: class );
2020-03-18 12:43:54 +03:00
$this -> registerAlias ( IAppConfig :: class , \OC\AppConfig :: class );
2017-03-17 16:30:46 +03:00
2020-03-18 12:43:54 +03:00
$this -> registerService ( IFactory :: class , function ( Server $c ) {
2016-01-15 13:09:37 +03:00
return new \OC\L10N\Factory (
$c -> getConfig (),
2016-01-27 17:54:57 +03:00
$c -> getRequest (),
2016-03-18 15:59:44 +03:00
$c -> getUserSession (),
\OC :: $SERVERROOT
2016-01-15 13:09:37 +03:00
);
2013-09-25 20:34:01 +04:00
});
2020-08-13 08:43:37 +03:00
/** @deprecated 19.0.0 */
2020-03-18 12:43:54 +03:00
$this -> registerDeprecatedAlias ( 'L10NFactory' , IFactory :: class );
2017-03-21 12:00:02 +03:00
2020-08-11 23:28:29 +03:00
$this -> registerAlias ( IURLGenerator :: class , URLGenerator :: class );
2020-08-13 08:43:37 +03:00
/** @deprecated 19.0.0 */
2020-03-18 12:43:54 +03:00
$this -> registerDeprecatedAlias ( 'URLGenerator' , IURLGenerator :: class );
2017-03-21 12:00:02 +03:00
2020-08-13 08:43:37 +03:00
/** @deprecated 19.0.0 */
2020-02-07 13:39:55 +03:00
$this -> registerDeprecatedAlias ( 'AppFetcher' , AppFetcher :: class );
2020-08-13 08:43:37 +03:00
/** @deprecated 19.0.0 */
2020-02-07 13:39:55 +03:00
$this -> registerDeprecatedAlias ( 'CategoryFetcher' , CategoryFetcher :: class );
2017-03-21 12:00:02 +03:00
2020-03-18 12:43:54 +03:00
$this -> registerService ( ICache :: class , function ( $c ) {
2015-06-15 18:54:48 +03:00
return new Cache\File ();
2013-09-17 19:46:33 +04:00
});
2020-08-13 08:43:37 +03:00
/** @deprecated 19.0.0 */
2020-03-18 12:43:54 +03:00
$this -> registerDeprecatedAlias ( 'UserCache' , ICache :: class );
2017-03-21 12:00:02 +03:00
2017-03-20 12:16:56 +03:00
$this -> registerService ( Factory :: class , function ( Server $c ) {
2017-06-15 13:35:16 +03:00
$arrayCacheFactory = new \OC\Memcache\Factory ( '' , $c -> getLogger (),
2018-01-26 01:16:13 +03:00
ArrayCache :: class ,
ArrayCache :: class ,
ArrayCache :: class
2017-06-15 13:35:16 +03:00
);
2015-01-14 21:25:00 +03:00
$config = $c -> getConfig ();
2015-03-18 13:47:16 +03:00
2015-12-03 16:10:05 +03:00
if ( $config -> getSystemValue ( 'installed' , false ) && ! ( defined ( 'PHPUNIT_RUN' ) && PHPUNIT_RUN )) {
2015-03-18 13:47:16 +03:00
$v = \OC_App :: getAppVersions ();
2017-06-15 13:46:51 +03:00
$v [ 'core' ] = implode ( ',' , \OC_Util :: getVersion ());
2015-03-18 13:47:16 +03:00
$version = implode ( ',' , $v );
$instanceId = \OC_Util :: getInstanceId ();
$path = \OC :: $SERVERROOT ;
2018-03-07 14:10:36 +03:00
$prefix = md5 ( $instanceId . '-' . $version . '-' . $path );
2015-07-15 17:21:07 +03:00
return new \OC\Memcache\Factory ( $prefix , $c -> getLogger (),
2015-03-18 13:47:16 +03:00
$config -> getSystemValue ( 'memcache.local' , null ),
2015-05-26 15:41:37 +03:00
$config -> getSystemValue ( 'memcache.distributed' , null ),
$config -> getSystemValue ( 'memcache.locking' , null )
2015-03-18 13:47:16 +03:00
);
}
2017-06-15 13:35:16 +03:00
return $arrayCacheFactory ;
2014-01-06 15:55:56 +04:00
});
2020-08-13 08:43:37 +03:00
/** @deprecated 19.0.0 */
2020-02-07 13:39:55 +03:00
$this -> registerDeprecatedAlias ( 'MemCacheFactory' , Factory :: class );
2017-03-20 12:16:56 +03:00
$this -> registerAlias ( ICacheFactory :: class , Factory :: class );
2016-04-14 16:41:04 +03:00
$this -> registerService ( 'RedisFactory' , function ( Server $c ) {
$systemConfig = $c -> getSystemConfig ();
return new RedisFactory ( $systemConfig );
});
2017-03-21 12:00:02 +03:00
$this -> registerService ( \OCP\Activity\IManager :: class , function ( Server $c ) {
2020-10-07 11:50:06 +03:00
$l10n = $this -> get ( IFactory :: class ) -> get ( 'lib' );
2016-05-02 12:57:24 +03:00
return new \OC\Activity\Manager (
2015-03-25 17:18:11 +03:00
$c -> getRequest (),
$c -> getUserSession (),
2016-11-10 17:33:00 +03:00
$c -> getConfig (),
2020-08-05 16:57:51 +03:00
$c -> query ( IValidator :: class ),
$l10n
2015-03-25 17:18:11 +03:00
);
2013-09-29 22:31:12 +04:00
});
2020-08-13 08:43:37 +03:00
/** @deprecated 19.0.0 */
2020-02-07 13:39:55 +03:00
$this -> registerDeprecatedAlias ( 'ActivityManager' , \OCP\Activity\IManager :: class );
2017-03-21 12:00:02 +03:00
2016-11-25 17:21:16 +03:00
$this -> registerService ( \OCP\Activity\IEventMerger :: class , function ( Server $c ) {
return new \OC\Activity\EventMerger (
$c -> getL10N ( 'lib' )
);
});
2016-11-10 17:33:00 +03:00
$this -> registerAlias ( IValidator :: class , Validator :: class );
2017-03-21 12:00:02 +03:00
2020-04-09 14:53:40 +03:00
$this -> registerService ( AvatarManager :: class , function ( Server $c ) {
2015-12-02 00:08:42 +03:00
return new AvatarManager (
2018-01-13 22:36:02 +03:00
$c -> query ( \OC\User\Manager :: class ),
2016-09-07 17:09:22 +03:00
$c -> getAppDataDir ( 'avatar' ),
2016-03-11 15:44:35 +03:00
$c -> getL10N ( 'lib' ),
2016-08-29 15:55:23 +03:00
$c -> getLogger (),
$c -> getConfig ()
2015-12-02 00:08:42 +03:00
);
2013-09-20 13:46:11 +04:00
});
2020-03-18 12:43:54 +03:00
$this -> registerAlias ( IAvatarManager :: class , AvatarManager :: class );
2020-08-13 08:43:37 +03:00
/** @deprecated 19.0.0 */
2020-02-07 13:39:55 +03:00
$this -> registerDeprecatedAlias ( 'AvatarManager' , AvatarManager :: class );
2017-03-21 12:00:02 +03:00
2017-11-12 17:28:04 +03:00
$this -> registerAlias ( \OCP\Support\CrashReport\IRegistry :: class , \OC\Support\CrashReport\Registry :: class );
2019-05-10 15:21:41 +03:00
$this -> registerAlias ( \OCP\Support\Subscription\IRegistry :: class , \OC\Support\Subscription\Registry :: class );
2017-11-12 17:28:04 +03:00
2019-01-07 14:32:07 +03:00
$this -> registerService ( \OC\Log :: class , function ( Server $c ) {
2020-02-07 13:39:55 +03:00
$logType = $c -> query ( AllConfig :: class ) -> getSystemValue ( 'log_type' , 'file' );
2018-04-27 00:54:11 +03:00
$factory = new LogFactory ( $c , $this -> getSystemConfig ());
2018-04-24 23:14:00 +03:00
$logger = $factory -> get ( $logType );
2017-11-12 17:28:04 +03:00
$registry = $c -> query ( \OCP\Support\CrashReport\IRegistry :: class );
2014-05-07 03:55:06 +04:00
2018-04-25 15:57:08 +03:00
return new Log ( $logger , $this -> getSystemConfig (), null , $registry );
2014-05-07 03:55:06 +04:00
});
2020-03-18 12:43:54 +03:00
$this -> registerAlias ( ILogger :: class , \OC\Log :: class );
2020-08-13 08:43:37 +03:00
/** @deprecated 19.0.0 */
2020-02-07 13:39:55 +03:00
$this -> registerDeprecatedAlias ( 'Logger' , \OC\Log :: class );
2019-12-03 12:16:28 +03:00
// PSR-3 logger
$this -> registerAlias ( LoggerInterface :: class , PsrLoggerAdapter :: class );
2017-03-21 12:00:02 +03:00
2018-04-25 03:27:43 +03:00
$this -> registerService ( ILogFactory :: class , function ( Server $c ) {
2018-04-27 00:54:11 +03:00
return new LogFactory ( $c , $this -> getSystemConfig ());
2018-04-25 03:27:43 +03:00
});
2020-08-11 23:38:14 +03:00
$this -> registerAlias ( IJobList :: class , \OC\BackgroundJob\JobList :: class );
2020-08-13 08:43:37 +03:00
/** @deprecated 19.0.0 */
2020-03-18 12:43:54 +03:00
$this -> registerDeprecatedAlias ( 'JobList' , IJobList :: class );
2017-03-21 12:00:02 +03:00
2020-03-18 12:43:54 +03:00
$this -> registerService ( IRouter :: class , function ( Server $c ) {
2014-03-24 17:55:03 +04:00
$cacheFactory = $c -> getMemCacheFactory ();
2015-11-27 15:51:20 +03:00
$logger = $c -> getLogger ();
2018-03-13 20:18:04 +03:00
if ( $cacheFactory -> isLocalCacheAvailable ()) {
2017-10-25 09:29:28 +03:00
$router = new \OC\Route\CachingRouter ( $cacheFactory -> createLocal ( 'route' ), $logger );
2014-03-24 17:55:03 +04:00
} else {
2015-11-27 15:51:20 +03:00
$router = new \OC\Route\Router ( $logger );
2014-03-24 17:55:03 +04:00
}
2014-03-10 17:04:58 +04:00
return $router ;
});
2020-08-13 08:43:37 +03:00
/** @deprecated 19.0.0 */
2020-03-18 12:43:54 +03:00
$this -> registerDeprecatedAlias ( 'Router' , IRouter :: class );
2017-03-21 12:00:02 +03:00
2020-08-11 23:38:14 +03:00
$this -> registerAlias ( ISearch :: class , Search :: class );
2020-08-13 08:43:37 +03:00
/** @deprecated 19.0.0 */
2020-03-18 12:43:54 +03:00
$this -> registerDeprecatedAlias ( 'Search' , ISearch :: class );
2017-03-21 12:00:02 +03:00
2017-08-24 17:21:50 +03:00
$this -> registerService ( \OC\Security\RateLimiting\Backend\IBackend :: class , function ( $c ) {
2017-04-12 22:27:40 +03:00
return new \OC\Security\RateLimiting\Backend\MemoryCache (
$this -> getMemCacheFactory (),
new \OC\AppFramework\Utility\TimeFactory ()
);
});
2020-08-11 23:38:14 +03:00
$this -> registerAlias ( \OCP\Security\ISecureRandom :: class , SecureRandom :: class );
2020-08-13 08:43:37 +03:00
/** @deprecated 19.0.0 */
2020-02-07 13:39:55 +03:00
$this -> registerDeprecatedAlias ( 'SecureRandom' , \OCP\Security\ISecureRandom :: class );
2017-03-21 12:00:02 +03:00
2020-08-11 23:38:14 +03:00
$this -> registerAlias ( ICrypto :: class , Crypto :: class );
2020-08-13 08:43:37 +03:00
/** @deprecated 19.0.0 */
2020-03-18 12:43:54 +03:00
$this -> registerDeprecatedAlias ( 'Crypto' , ICrypto :: class );
2017-03-21 12:00:02 +03:00
2020-08-11 23:38:14 +03:00
$this -> registerAlias ( IHasher :: class , Hasher :: class );
2020-08-13 08:43:37 +03:00
/** @deprecated 19.0.0 */
2020-03-18 12:43:54 +03:00
$this -> registerDeprecatedAlias ( 'Hasher' , IHasher :: class );
2017-03-21 12:00:02 +03:00
2020-08-11 23:38:14 +03:00
$this -> registerAlias ( ICredentialsManager :: class , CredentialsManager :: class );
2020-08-13 08:43:37 +03:00
/** @deprecated 19.0.0 */
2020-03-18 12:43:54 +03:00
$this -> registerDeprecatedAlias ( 'CredentialsManager' , ICredentialsManager :: class );
2017-03-21 12:00:02 +03:00
2017-03-20 01:14:47 +03:00
$this -> registerService ( IDBConnection :: class , function ( Server $c ) {
2014-11-27 18:40:12 +03:00
$systemConfig = $c -> getSystemConfig ();
2017-03-18 01:37:48 +03:00
$factory = new \OC\DB\ConnectionFactory ( $systemConfig );
2014-11-27 18:40:12 +03:00
$type = $systemConfig -> getValue ( 'dbtype' , 'sqlite' );
2014-09-10 15:24:49 +04:00
if ( ! $factory -> isValidType ( $type )) {
2014-11-26 14:38:24 +03:00
throw new \OC\DatabaseException ( 'Invalid database type' );
2014-09-10 15:24:49 +04:00
}
2017-03-18 01:37:48 +03:00
$connectionParams = $factory -> createConnectionParams ();
2014-09-10 15:24:49 +04:00
$connection = $factory -> getConnection ( $type , $connectionParams );
$connection -> getConfiguration () -> setSQLLogger ( $c -> getQueryLogger ());
return $connection ;
});
2020-08-13 08:43:37 +03:00
/** @deprecated 19.0.0 */
2020-02-07 13:39:55 +03:00
$this -> registerDeprecatedAlias ( 'DatabaseConnection' , IDBConnection :: class );
2017-03-21 12:00:02 +03:00
2020-03-18 12:43:54 +03:00
$this -> registerService ( IClientService :: class , function ( Server $c ) {
2015-03-16 13:28:23 +03:00
$user = \OC_User :: getUser ();
$uid = $user ? $user : null ;
return new ClientService (
$c -> getConfig (),
2020-03-24 16:19:57 +03:00
$c -> getLogger (),
2017-05-19 23:51:26 +03:00
new \OC\Security\CertificateManager (
$uid ,
new View (),
$c -> getConfig (),
$c -> getLogger (),
$c -> getSecureRandom ()
)
2015-03-16 13:28:23 +03:00
);
2014-09-11 21:21:56 +04:00
});
2020-08-13 08:43:37 +03:00
/** @deprecated 19.0.0 */
2020-03-18 12:43:54 +03:00
$this -> registerDeprecatedAlias ( 'HttpClientService' , IClientService :: class );
$this -> registerService ( IEventLogger :: class , function ( Server $c ) {
2017-04-20 12:31:00 +03:00
$eventLogger = new EventLogger ();
2015-08-24 13:00:37 +03:00
if ( $c -> getSystemConfig () -> getValue ( 'debug' , false )) {
2017-04-20 12:31:00 +03:00
// In debug mode, module is being activated by default
$eventLogger -> activate ();
2014-10-03 03:16:57 +04:00
}
2017-04-20 12:31:00 +03:00
return $eventLogger ;
2014-10-03 03:16:57 +04:00
});
2020-08-13 08:43:37 +03:00
/** @deprecated 19.0.0 */
2020-03-18 12:43:54 +03:00
$this -> registerDeprecatedAlias ( 'EventLogger' , IEventLogger :: class );
2017-03-21 12:00:02 +03:00
2020-03-18 12:43:54 +03:00
$this -> registerService ( IQueryLogger :: class , function ( Server $c ) {
2017-04-20 12:31:00 +03:00
$queryLogger = new QueryLogger ();
2015-08-24 13:00:37 +03:00
if ( $c -> getSystemConfig () -> getValue ( 'debug' , false )) {
2017-04-20 12:31:00 +03:00
// In debug mode, module is being activated by default
$queryLogger -> activate ();
2014-10-03 03:35:07 +04:00
}
2017-04-20 12:31:00 +03:00
return $queryLogger ;
2014-10-03 03:35:07 +04:00
});
2020-08-13 08:43:37 +03:00
/** @deprecated 19.0.0 */
2020-03-18 12:43:54 +03:00
$this -> registerDeprecatedAlias ( 'QueryLogger' , IQueryLogger :: class );
2017-03-21 12:00:02 +03:00
2020-08-13 08:43:37 +03:00
/** @deprecated 19.0.0 */
2020-02-07 13:39:55 +03:00
$this -> registerDeprecatedAlias ( 'TempManager' , TempManager :: class );
2017-03-20 12:16:56 +03:00
$this -> registerAlias ( ITempManager :: class , TempManager :: class );
$this -> registerService ( AppManager :: class , function ( Server $c ) {
2015-04-01 16:37:22 +03:00
return new \OC\App\AppManager (
$c -> getUserSession (),
2019-09-05 13:55:24 +03:00
$c -> getConfig (),
2018-01-17 23:10:40 +03:00
$c -> query ( \OC\AppConfig :: class ),
2015-04-01 16:37:22 +03:00
$c -> getGroupManager (),
2016-02-09 04:51:12 +03:00
$c -> getMemCacheFactory (),
2019-07-15 23:19:11 +03:00
$c -> getEventDispatcher (),
$c -> getLogger ()
2015-04-01 16:37:22 +03:00
);
2014-11-07 16:26:12 +03:00
});
2020-08-13 08:43:37 +03:00
/** @deprecated 19.0.0 */
2020-02-07 13:39:55 +03:00
$this -> registerDeprecatedAlias ( 'AppManager' , AppManager :: class );
2017-03-20 12:16:56 +03:00
$this -> registerAlias ( IAppManager :: class , AppManager :: class );
2020-08-11 23:38:14 +03:00
$this -> registerAlias ( IDateTimeZone :: class , DateTimeZone :: class );
2020-08-13 08:43:37 +03:00
/** @deprecated 19.0.0 */
2020-03-18 12:43:54 +03:00
$this -> registerDeprecatedAlias ( 'DateTimeZone' , IDateTimeZone :: class );
2017-03-21 12:00:02 +03:00
2020-03-18 12:43:54 +03:00
$this -> registerService ( IDateTimeFormatter :: class , function ( Server $c ) {
2014-11-24 18:37:04 +03:00
$language = $c -> getConfig () -> getUserValue ( $c -> getSession () -> get ( 'user_id' ), 'core' , 'lang' , null );
2014-12-16 17:34:55 +03:00
return new DateTimeFormatter (
$c -> getDateTimeZone () -> getTimeZone (),
$c -> getL10N ( 'lib' , $language )
);
2014-11-24 18:37:04 +03:00
});
2020-08-13 08:43:37 +03:00
/** @deprecated 19.0.0 */
2020-03-18 12:43:54 +03:00
$this -> registerDeprecatedAlias ( 'DateTimeFormatter' , IDateTimeFormatter :: class );
2017-03-21 12:00:02 +03:00
2020-03-18 12:43:54 +03:00
$this -> registerService ( IUserMountCache :: class , function ( Server $c ) {
2015-12-03 16:10:05 +03:00
$mountCache = new UserMountCache ( $c -> getDatabaseConnection (), $c -> getUserManager (), $c -> getLogger ());
$listener = new UserMountCacheListener ( $mountCache );
$listener -> listen ( $c -> getUserManager ());
return $mountCache ;
});
2020-08-13 08:43:37 +03:00
/** @deprecated 19.0.0 */
2020-03-18 12:43:54 +03:00
$this -> registerDeprecatedAlias ( 'UserMountCache' , IUserMountCache :: class );
2017-03-21 12:00:02 +03:00
2020-03-18 12:43:54 +03:00
$this -> registerService ( IMountProviderCollection :: class , function ( Server $c ) {
2014-11-24 17:54:42 +03:00
$loader = \OC\Files\Filesystem :: getLoader ();
2020-03-18 12:43:54 +03:00
$mountCache = $c -> query ( IUserMountCache :: class );
2017-08-24 17:21:50 +03:00
$manager = new \OC\Files\Config\MountProviderCollection ( $loader , $mountCache );
2016-04-21 15:48:08 +03:00
// builtin providers
$config = $c -> getConfig ();
2020-07-30 23:09:19 +03:00
$logger = $c -> getLogger ();
2016-04-21 15:48:08 +03:00
$manager -> registerProvider ( new CacheMountProvider ( $config ));
2016-05-17 22:40:55 +03:00
$manager -> registerHomeProvider ( new LocalHomeMountProvider ());
$manager -> registerHomeProvider ( new ObjectHomeMountProvider ( $config ));
2020-07-30 23:09:19 +03:00
$manager -> registerRootProvider ( new ObjectStorePreviewCacheMountProvider ( $logger , $config ));
2016-04-21 15:48:08 +03:00
return $manager ;
2014-11-24 17:54:42 +03:00
});
2020-08-13 08:43:37 +03:00
/** @deprecated 19.0.0 */
2020-03-18 12:43:54 +03:00
$this -> registerDeprecatedAlias ( 'MountConfigManager' , IMountProviderCollection :: class );
2017-03-21 12:00:02 +03:00
2020-08-13 08:43:37 +03:00
/** @deprecated 20.0.0 */
2020-08-12 23:46:32 +03:00
$this -> registerDeprecatedAlias ( 'IniWrapper' , IniGetWrapper :: class );
2015-02-17 18:49:14 +03:00
$this -> registerService ( 'AsyncCommandBus' , function ( Server $c ) {
2017-08-24 17:21:50 +03:00
$busClass = $c -> getConfig () -> getSystemValue ( 'commandbus' );
if ( $busClass ) {
2020-07-02 18:28:27 +03:00
[ $app , $class ] = explode ( '::' , $busClass , 2 );
2017-08-24 17:21:50 +03:00
if ( $c -> getAppManager () -> isInstalled ( $app )) {
\OC_App :: loadApp ( $app );
return $c -> query ( $class );
} else {
throw new ServiceUnavailableException ( " The app providing the command bus ( $app ) is not enabled " );
}
} else {
$jobList = $c -> getJobList ();
return new CronBus ( $jobList );
}
2015-02-17 18:49:14 +03:00
});
2020-07-02 18:28:27 +03:00
$this -> registerAlias ( IBus :: class , 'AsyncCommandBus' );
2020-08-13 08:43:37 +03:00
/** @deprecated 20.0.0 */
2020-08-12 23:46:32 +03:00
$this -> registerDeprecatedAlias ( 'TrustedDomainHelper' , TrustedDomainHelper :: class );
2020-08-13 08:43:37 +03:00
/** @deprecated 19.0.0 */
2020-02-07 13:39:55 +03:00
$this -> registerDeprecatedAlias ( 'Throttler' , Throttler :: class );
Add code integrity check
This PR implements the base foundation of the code signing and integrity check. In this PR implemented is the signing and verification logic, as well as commands to sign single apps or the core repository.
Furthermore, there is a basic implementation to display problems with the code integrity on the update screen.
Code signing basically happens the following way:
- There is a ownCloud Root Certificate authority stored `resources/codesigning/root.crt` (in this PR I also ship the private key which we obviously need to change before a release :wink:). This certificate is not intended to be used for signing directly and only is used to sign new certificates.
- Using the `integrity:sign-core` and `integrity:sign-app` commands developers can sign either the core release or a single app. The core release needs to be signed with a certificate that has a CN of `core`, apps need to be signed with a certificate that either has a CN of `core` (shipped apps!) or the AppID.
- The command generates a signature.json file of the following format:
```json
{
"hashes": {
"/filename.php": "2401fed2eea6f2c1027c482a633e8e25cd46701f811e2d2c10dc213fd95fa60e350bccbbebdccc73a042b1a2799f673fbabadc783284cc288e4f1a1eacb74e3d",
"/lib/base.php": "55548cc16b457cd74241990cc9d3b72b6335f2e5f45eee95171da024087d114fcbc2effc3d5818a6d5d55f2ae960ab39fd0414d0c542b72a3b9e08eb21206dd9"
},
"certificate": "-----BEGIN CERTIFICATE-----MIIBvTCCASagAwIBAgIUPvawyqJwCwYazcv7iz16TWxfeUMwDQYJKoZIhvcNAQEF\nBQAwIzEhMB8GA1UECgwYb3duQ2xvdWQgQ29kZSBTaWduaW5nIENBMB4XDTE1MTAx\nNDEzMTcxMFoXDTE2MTAxNDEzMTcxMFowEzERMA8GA1UEAwwIY29udGFjdHMwgZ8w\nDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANoQesGdCW0L2L+a2xITYipixkScrIpB\nkX5Snu3fs45MscDb61xByjBSlFgR4QI6McoCipPw4SUr28EaExVvgPSvqUjYLGps\nfiv0Cvgquzbx/X3mUcdk9LcFo1uWGtrTfkuXSKX41PnJGTr6RQWGIBd1V52q1qbC\nJKkfzyeMeuQfAgMBAAEwDQYJKoZIhvcNAQEFBQADgYEAvF/KIhRMQ3tYTmgHWsiM\nwDMgIDb7iaHF0fS+/Nvo4PzoTO/trev6tMyjLbJ7hgdCpz/1sNzE11Cibf6V6dsz\njCE9invP368Xv0bTRObRqeSNsGogGl5ceAvR0c9BG+NRIKHcly3At3gLkS2791bC\niG+UxI/MNcWV0uJg9S63LF8=\n-----END CERTIFICATE-----",
"signature": "U29tZVNpZ25lZERhdGFFeGFtcGxl"
}
```
`hashes` is an array of all files in the folder with their corresponding SHA512 hashes (this is actually quite cheap to calculate), the `certificate` is the certificate used for signing. It has to be issued by the ownCloud Root Authority and it's CN needs to be permitted to perform the required action. The `signature` is then a signature of the `hashes` which can be verified using the `certificate`.
Steps to do in other PRs, this is already a quite huge one:
- Add nag screen in case the code check fails to ensure that administrators are aware of this.
- Add code verification also to OCC upgrade and unify display code more.
- Add enforced code verification to apps shipped from the appstore with a level of "official"
- Add enfocrced code verification to apps shipped from the appstore that were already signed in a previous release
- Add some developer documentation on how devs can request their own certificate
- Check when installing ownCloud
- Add support for CRLs to allow revoking certificates
**Note:** The upgrade checks are only run when the instance has a defined release channel of `stable` (defined in `version.php`). If you want to test this, you need to change the channel thus and then generate the core signature:
```
➜ master git:(add-integrity-checker) ✗ ./occ integrity:sign-core --privateKey=resources/codesigning/core.key --certificate=resources/codesigning/core.crt
Successfully signed "core"
```
Then increase the version and you should see something like the following:
![2015-11-04_12-02-57](https://cloud.githubusercontent.com/assets/878997/10936336/6adb1d14-82ec-11e5-8f06-9a74801c9abf.png)
As you can see a failed code check will not prevent the further update. It will instead just be a notice to the admin. In a next step we will add some nag screen.
For packaging stable releases this requires the following additional steps as a last action before zipping:
1. Run `./occ integrity:sign-core` once
2. Run `./occ integrity:sign-app` _for each_ app. However, this can be simply automated using a simple foreach on the apps folder.
2015-11-03 22:26:06 +03:00
$this -> registerService ( 'IntegrityCodeChecker' , function ( Server $c ) {
// IConfig and IAppManager requires a working database. This code
// might however be called when ownCloud is not yet setup.
2017-08-24 17:21:50 +03:00
if ( \OC :: $server -> getSystemConfig () -> getValue ( 'installed' , false )) {
Add code integrity check
This PR implements the base foundation of the code signing and integrity check. In this PR implemented is the signing and verification logic, as well as commands to sign single apps or the core repository.
Furthermore, there is a basic implementation to display problems with the code integrity on the update screen.
Code signing basically happens the following way:
- There is a ownCloud Root Certificate authority stored `resources/codesigning/root.crt` (in this PR I also ship the private key which we obviously need to change before a release :wink:). This certificate is not intended to be used for signing directly and only is used to sign new certificates.
- Using the `integrity:sign-core` and `integrity:sign-app` commands developers can sign either the core release or a single app. The core release needs to be signed with a certificate that has a CN of `core`, apps need to be signed with a certificate that either has a CN of `core` (shipped apps!) or the AppID.
- The command generates a signature.json file of the following format:
```json
{
"hashes": {
"/filename.php": "2401fed2eea6f2c1027c482a633e8e25cd46701f811e2d2c10dc213fd95fa60e350bccbbebdccc73a042b1a2799f673fbabadc783284cc288e4f1a1eacb74e3d",
"/lib/base.php": "55548cc16b457cd74241990cc9d3b72b6335f2e5f45eee95171da024087d114fcbc2effc3d5818a6d5d55f2ae960ab39fd0414d0c542b72a3b9e08eb21206dd9"
},
"certificate": "-----BEGIN CERTIFICATE-----MIIBvTCCASagAwIBAgIUPvawyqJwCwYazcv7iz16TWxfeUMwDQYJKoZIhvcNAQEF\nBQAwIzEhMB8GA1UECgwYb3duQ2xvdWQgQ29kZSBTaWduaW5nIENBMB4XDTE1MTAx\nNDEzMTcxMFoXDTE2MTAxNDEzMTcxMFowEzERMA8GA1UEAwwIY29udGFjdHMwgZ8w\nDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANoQesGdCW0L2L+a2xITYipixkScrIpB\nkX5Snu3fs45MscDb61xByjBSlFgR4QI6McoCipPw4SUr28EaExVvgPSvqUjYLGps\nfiv0Cvgquzbx/X3mUcdk9LcFo1uWGtrTfkuXSKX41PnJGTr6RQWGIBd1V52q1qbC\nJKkfzyeMeuQfAgMBAAEwDQYJKoZIhvcNAQEFBQADgYEAvF/KIhRMQ3tYTmgHWsiM\nwDMgIDb7iaHF0fS+/Nvo4PzoTO/trev6tMyjLbJ7hgdCpz/1sNzE11Cibf6V6dsz\njCE9invP368Xv0bTRObRqeSNsGogGl5ceAvR0c9BG+NRIKHcly3At3gLkS2791bC\niG+UxI/MNcWV0uJg9S63LF8=\n-----END CERTIFICATE-----",
"signature": "U29tZVNpZ25lZERhdGFFeGFtcGxl"
}
```
`hashes` is an array of all files in the folder with their corresponding SHA512 hashes (this is actually quite cheap to calculate), the `certificate` is the certificate used for signing. It has to be issued by the ownCloud Root Authority and it's CN needs to be permitted to perform the required action. The `signature` is then a signature of the `hashes` which can be verified using the `certificate`.
Steps to do in other PRs, this is already a quite huge one:
- Add nag screen in case the code check fails to ensure that administrators are aware of this.
- Add code verification also to OCC upgrade and unify display code more.
- Add enforced code verification to apps shipped from the appstore with a level of "official"
- Add enfocrced code verification to apps shipped from the appstore that were already signed in a previous release
- Add some developer documentation on how devs can request their own certificate
- Check when installing ownCloud
- Add support for CRLs to allow revoking certificates
**Note:** The upgrade checks are only run when the instance has a defined release channel of `stable` (defined in `version.php`). If you want to test this, you need to change the channel thus and then generate the core signature:
```
➜ master git:(add-integrity-checker) ✗ ./occ integrity:sign-core --privateKey=resources/codesigning/core.key --certificate=resources/codesigning/core.crt
Successfully signed "core"
```
Then increase the version and you should see something like the following:
![2015-11-04_12-02-57](https://cloud.githubusercontent.com/assets/878997/10936336/6adb1d14-82ec-11e5-8f06-9a74801c9abf.png)
As you can see a failed code check will not prevent the further update. It will instead just be a notice to the admin. In a next step we will add some nag screen.
For packaging stable releases this requires the following additional steps as a last action before zipping:
1. Run `./occ integrity:sign-core` once
2. Run `./occ integrity:sign-app` _for each_ app. However, this can be simply automated using a simple foreach on the apps folder.
2015-11-03 22:26:06 +03:00
$config = $c -> getConfig ();
$appManager = $c -> getAppManager ();
} else {
$config = null ;
$appManager = null ;
}
return new Checker (
2017-08-24 17:21:50 +03:00
new EnvironmentHelper (),
new FileAccessHelper (),
new AppLocator (),
$config ,
$c -> getMemCacheFactory (),
$appManager ,
2019-05-27 22:54:58 +03:00
$c -> getTempManager (),
$c -> getMimeTypeDetector ()
Add code integrity check
This PR implements the base foundation of the code signing and integrity check. In this PR implemented is the signing and verification logic, as well as commands to sign single apps or the core repository.
Furthermore, there is a basic implementation to display problems with the code integrity on the update screen.
Code signing basically happens the following way:
- There is a ownCloud Root Certificate authority stored `resources/codesigning/root.crt` (in this PR I also ship the private key which we obviously need to change before a release :wink:). This certificate is not intended to be used for signing directly and only is used to sign new certificates.
- Using the `integrity:sign-core` and `integrity:sign-app` commands developers can sign either the core release or a single app. The core release needs to be signed with a certificate that has a CN of `core`, apps need to be signed with a certificate that either has a CN of `core` (shipped apps!) or the AppID.
- The command generates a signature.json file of the following format:
```json
{
"hashes": {
"/filename.php": "2401fed2eea6f2c1027c482a633e8e25cd46701f811e2d2c10dc213fd95fa60e350bccbbebdccc73a042b1a2799f673fbabadc783284cc288e4f1a1eacb74e3d",
"/lib/base.php": "55548cc16b457cd74241990cc9d3b72b6335f2e5f45eee95171da024087d114fcbc2effc3d5818a6d5d55f2ae960ab39fd0414d0c542b72a3b9e08eb21206dd9"
},
"certificate": "-----BEGIN CERTIFICATE-----MIIBvTCCASagAwIBAgIUPvawyqJwCwYazcv7iz16TWxfeUMwDQYJKoZIhvcNAQEF\nBQAwIzEhMB8GA1UECgwYb3duQ2xvdWQgQ29kZSBTaWduaW5nIENBMB4XDTE1MTAx\nNDEzMTcxMFoXDTE2MTAxNDEzMTcxMFowEzERMA8GA1UEAwwIY29udGFjdHMwgZ8w\nDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANoQesGdCW0L2L+a2xITYipixkScrIpB\nkX5Snu3fs45MscDb61xByjBSlFgR4QI6McoCipPw4SUr28EaExVvgPSvqUjYLGps\nfiv0Cvgquzbx/X3mUcdk9LcFo1uWGtrTfkuXSKX41PnJGTr6RQWGIBd1V52q1qbC\nJKkfzyeMeuQfAgMBAAEwDQYJKoZIhvcNAQEFBQADgYEAvF/KIhRMQ3tYTmgHWsiM\nwDMgIDb7iaHF0fS+/Nvo4PzoTO/trev6tMyjLbJ7hgdCpz/1sNzE11Cibf6V6dsz\njCE9invP368Xv0bTRObRqeSNsGogGl5ceAvR0c9BG+NRIKHcly3At3gLkS2791bC\niG+UxI/MNcWV0uJg9S63LF8=\n-----END CERTIFICATE-----",
"signature": "U29tZVNpZ25lZERhdGFFeGFtcGxl"
}
```
`hashes` is an array of all files in the folder with their corresponding SHA512 hashes (this is actually quite cheap to calculate), the `certificate` is the certificate used for signing. It has to be issued by the ownCloud Root Authority and it's CN needs to be permitted to perform the required action. The `signature` is then a signature of the `hashes` which can be verified using the `certificate`.
Steps to do in other PRs, this is already a quite huge one:
- Add nag screen in case the code check fails to ensure that administrators are aware of this.
- Add code verification also to OCC upgrade and unify display code more.
- Add enforced code verification to apps shipped from the appstore with a level of "official"
- Add enfocrced code verification to apps shipped from the appstore that were already signed in a previous release
- Add some developer documentation on how devs can request their own certificate
- Check when installing ownCloud
- Add support for CRLs to allow revoking certificates
**Note:** The upgrade checks are only run when the instance has a defined release channel of `stable` (defined in `version.php`). If you want to test this, you need to change the channel thus and then generate the core signature:
```
➜ master git:(add-integrity-checker) ✗ ./occ integrity:sign-core --privateKey=resources/codesigning/core.key --certificate=resources/codesigning/core.crt
Successfully signed "core"
```
Then increase the version and you should see something like the following:
![2015-11-04_12-02-57](https://cloud.githubusercontent.com/assets/878997/10936336/6adb1d14-82ec-11e5-8f06-9a74801c9abf.png)
As you can see a failed code check will not prevent the further update. It will instead just be a notice to the admin. In a next step we will add some nag screen.
For packaging stable releases this requires the following additional steps as a last action before zipping:
1. Run `./occ integrity:sign-core` once
2. Run `./occ integrity:sign-app` _for each_ app. However, this can be simply automated using a simple foreach on the apps folder.
2015-11-03 22:26:06 +03:00
);
});
2017-03-21 12:00:02 +03:00
$this -> registerService ( \OCP\IRequest :: class , function ( $c ) {
2015-02-27 15:05:57 +03:00
if ( isset ( $this [ 'urlParams' ])) {
$urlParams = $this [ 'urlParams' ];
} else {
$urlParams = [];
}
if ( defined ( 'PHPUNIT_RUN' ) && PHPUNIT_RUN
&& in_array ( 'fakeinput' , stream_get_wrappers ())
) {
$stream = 'fakeinput://data' ;
} else {
$stream = 'php://input' ;
}
return new Request (
[
'get' => $_GET ,
'post' => $_POST ,
'files' => $_FILES ,
'server' => $_SERVER ,
'env' => $_ENV ,
'cookies' => $_COOKIE ,
'method' => ( isset ( $_SERVER ) && isset ( $_SERVER [ 'REQUEST_METHOD' ]))
? $_SERVER [ 'REQUEST_METHOD' ]
2018-02-22 12:22:11 +03:00
: '' ,
2015-02-27 15:05:57 +03:00
'urlParams' => $urlParams ,
],
$this -> getSecureRandom (),
$this -> getConfig (),
2016-01-25 19:15:54 +03:00
$this -> getCsrfTokenManager (),
2015-02-27 15:05:57 +03:00
$stream
);
});
2020-08-13 08:43:37 +03:00
/** @deprecated 19.0.0 */
2020-02-07 13:39:55 +03:00
$this -> registerDeprecatedAlias ( 'Request' , \OCP\IRequest :: class );
2017-03-21 12:00:02 +03:00
2020-03-18 12:43:54 +03:00
$this -> registerService ( IMailer :: class , function ( Server $c ) {
2015-03-16 15:01:17 +03:00
return new Mailer (
$c -> getConfig (),
$c -> getLogger (),
2017-04-11 17:35:46 +03:00
$c -> query ( Defaults :: class ),
$c -> getURLGenerator (),
2019-03-16 04:29:03 +03:00
$c -> getL10N ( 'lib' ),
2020-03-31 15:02:39 +03:00
$c -> query ( IEventDispatcher :: class ),
$c -> getL10NFactory ()
2015-03-16 15:01:17 +03:00
);
2015-02-12 15:53:27 +03:00
});
2020-08-13 08:43:37 +03:00
/** @deprecated 19.0.0 */
2020-03-18 12:43:54 +03:00
$this -> registerDeprecatedAlias ( 'Mailer' , IMailer :: class );
2017-03-21 12:00:02 +03:00
2017-08-24 17:21:50 +03:00
$this -> registerService ( 'LDAPProvider' , function ( Server $c ) {
2016-07-22 11:46:29 +03:00
$config = $c -> getConfig ();
$factoryClass = $config -> getSystemValue ( 'ldapProviderFactory' , null );
2017-08-24 17:21:50 +03:00
if ( is_null ( $factoryClass )) {
2016-07-22 11:46:29 +03:00
throw new \Exception ( 'ldapProviderFactory not set' );
}
/** @var \OCP\LDAP\ILDAPProviderFactory $factory */
$factory = new $factoryClass ( $this );
return $factory -> getLDAPProvider ();
});
2017-07-22 14:46:09 +03:00
$this -> registerService ( ILockingProvider :: class , function ( Server $c ) {
2020-08-20 15:08:18 +03:00
$ini = $c -> get ( IniGetWrapper :: class );
2016-03-24 16:07:43 +03:00
$config = $c -> getConfig ();
$ttl = $config -> getSystemValue ( 'filelocking.ttl' , max ( 3600 , $ini -> getNumeric ( 'max_execution_time' )));
if ( $config -> getSystemValue ( 'filelocking.enabled' , true ) or ( defined ( 'PHPUNIT_RUN' ) && PHPUNIT_RUN )) {
2015-05-21 17:11:10 +03:00
/** @var \OC\Memcache\Factory $memcacheFactory */
$memcacheFactory = $c -> getMemCacheFactory ();
2015-05-26 15:41:37 +03:00
$memcache = $memcacheFactory -> createLocking ( 'lock' );
2015-09-02 17:55:37 +03:00
if ( ! ( $memcache instanceof \OC\Memcache\NullCache )) {
2016-03-24 16:07:43 +03:00
return new MemcacheLockingProvider ( $memcache , $ttl );
2015-09-02 17:55:37 +03:00
}
2018-04-10 19:30:43 +03:00
return new DBLockingProvider (
$c -> getDatabaseConnection (),
$c -> getLogger (),
new TimeFactory (),
$ttl ,
! \OC :: $CLI
);
2015-05-21 17:11:10 +03:00
}
return new NoopLockingProvider ();
2015-05-04 15:02:27 +03:00
});
2020-08-13 08:43:37 +03:00
/** @deprecated 19.0.0 */
2020-02-07 13:39:55 +03:00
$this -> registerDeprecatedAlias ( 'LockingProvider' , ILockingProvider :: class );
2017-03-21 12:00:02 +03:00
2020-08-11 23:38:14 +03:00
$this -> registerAlias ( IMountManager :: class , \OC\Files\Mount\Manager :: class );
2020-08-13 08:43:37 +03:00
/** @deprecated 19.0.0 */
2020-03-18 12:43:54 +03:00
$this -> registerDeprecatedAlias ( 'MountManager' , IMountManager :: class );
2017-03-21 12:00:02 +03:00
2020-03-18 12:43:54 +03:00
$this -> registerService ( IMimeTypeDetector :: class , function ( Server $c ) {
2015-07-20 13:28:36 +03:00
return new \OC\Files\Type\Detection (
$c -> getURLGenerator (),
2019-12-08 19:20:50 +03:00
$c -> getLogger (),
2016-07-29 18:47:39 +03:00
\OC :: $configDir ,
2015-09-08 13:17:57 +03:00
\OC :: $SERVERROOT . '/resources/config/'
2015-12-03 16:10:05 +03:00
);
2015-04-09 16:19:57 +03:00
});
2020-08-13 08:43:37 +03:00
/** @deprecated 19.0.0 */
2020-03-18 12:43:54 +03:00
$this -> registerDeprecatedAlias ( 'MimeTypeDetector' , IMimeTypeDetector :: class );
2017-03-21 12:00:02 +03:00
2020-08-11 23:38:14 +03:00
$this -> registerAlias ( IMimeTypeLoader :: class , Loader :: class );
2020-08-13 08:43:37 +03:00
/** @deprecated 19.0.0 */
2020-03-18 12:43:54 +03:00
$this -> registerDeprecatedAlias ( 'MimeTypeLoader' , IMimeTypeLoader :: class );
2017-04-23 23:10:17 +03:00
$this -> registerService ( BundleFetcher :: class , function () {
return new BundleFetcher ( $this -> getL10N ( 'lib' ));
});
2020-08-11 23:38:14 +03:00
$this -> registerAlias ( \OCP\Notification\IManager :: class , Manager :: class );
2020-08-13 08:43:37 +03:00
/** @deprecated 19.0.0 */
2020-02-07 13:39:55 +03:00
$this -> registerDeprecatedAlias ( 'NotificationManager' , \OCP\Notification\IManager :: class );
2017-03-21 12:00:02 +03:00
2020-03-18 12:43:54 +03:00
$this -> registerService ( CapabilitiesManager :: class , function ( Server $c ) {
$manager = new CapabilitiesManager ( $c -> getLogger ());
2015-12-03 16:10:05 +03:00
$manager -> registerCapability ( function () use ( $c ) {
2015-07-22 14:04:56 +03:00
return new \OC\OCS\CoreCapabilities ( $c -> getConfig ());
2015-07-21 22:44:59 +03:00
});
2017-07-12 22:46:25 +03:00
$manager -> registerCapability ( function () use ( $c ) {
return $c -> query ( \OC\Security\Bruteforce\Capabilities :: class );
});
2015-07-21 22:44:59 +03:00
return $manager ;
2015-03-21 22:03:56 +03:00
});
2020-08-13 08:43:37 +03:00
/** @deprecated 19.0.0 */
2020-03-18 12:43:54 +03:00
$this -> registerDeprecatedAlias ( 'CapabilitiesManager' , CapabilitiesManager :: class );
2017-03-21 12:00:02 +03:00
2020-03-18 12:43:54 +03:00
$this -> registerService ( ICommentsManager :: class , function ( Server $c ) {
2015-11-24 01:53:55 +03:00
$config = $c -> getConfig ();
2018-01-26 01:16:13 +03:00
$factoryClass = $config -> getSystemValue ( 'comments.managerFactory' , CommentsManagerFactory :: class );
2015-11-24 01:53:55 +03:00
/** @var \OCP\Comments\ICommentsManagerFactory $factory */
2016-01-19 18:17:49 +03:00
$factory = new $factoryClass ( $this );
2017-12-12 19:36:31 +03:00
$manager = $factory -> getManager ();
2020-04-09 14:53:40 +03:00
$manager -> registerDisplayNameResolver ( 'user' , function ( $id ) use ( $c ) {
2017-12-12 19:36:31 +03:00
$manager = $c -> getUserManager ();
$user = $manager -> get ( $id );
2020-04-10 15:19:56 +03:00
if ( is_null ( $user )) {
2017-12-12 19:36:31 +03:00
$l = $c -> getL10N ( 'core' );
$displayName = $l -> t ( 'Unknown user' );
} else {
$displayName = $user -> getDisplayName ();
}
return $displayName ;
});
return $manager ;
2015-11-24 01:53:55 +03:00
});
2020-08-13 08:43:37 +03:00
/** @deprecated 19.0.0 */
2020-03-18 12:43:54 +03:00
$this -> registerDeprecatedAlias ( 'CommentsManager' , ICommentsManager :: class );
2017-03-21 12:00:02 +03:00
2020-08-11 23:38:14 +03:00
$this -> registerAlias ( \OC_Defaults :: class , 'ThemingDefaults' );
2017-08-24 17:21:50 +03:00
$this -> registerService ( 'ThemingDefaults' , function ( Server $c ) {
2016-08-24 14:22:21 +03:00
/*
* Dark magic for autoloader .
* If we do a class_exists it will try to load the class which will
* make composer cache the result . Resulting in errors when enabling
* the theming app .
*/
$prefixes = \OC :: $composerAutoloader -> getPrefixesPsr4 ();
if ( isset ( $prefixes [ 'OCA\\Theming\\' ])) {
$classExists = true ;
} else {
2016-07-22 17:49:33 +03:00
$classExists = false ;
}
2017-07-21 12:46:35 +03:00
if ( $classExists && $c -> getConfig () -> getSystemValue ( 'installed' , false ) && $c -> getAppManager () -> isInstalled ( 'theming' ) && $c -> getTrustedDomainHelper () -> isTrustedDomain ( $c -> getRequest () -> getInsecureServerHost ())) {
2016-08-12 16:30:35 +03:00
return new ThemingDefaults (
2016-08-23 23:02:28 +03:00
$c -> getConfig (),
$c -> getL10N ( 'theming' ),
$c -> getURLGenerator (),
2017-02-17 18:42:07 +03:00
$c -> getMemCacheFactory (),
2018-02-26 15:54:00 +03:00
new Util ( $c -> getConfig (), $this -> getAppManager (), $c -> getAppDataDir ( 'theming' )),
2020-09-23 18:48:48 +03:00
new ImageManager ( $c -> getConfig (), $c -> getAppDataDir ( 'theming' ), $c -> getURLGenerator (), $this -> getMemCacheFactory (), $this -> getLogger (), $this -> getTempManager ()),
2019-02-18 11:12:11 +03:00
$c -> getAppManager (),
$c -> getNavigationManager ()
2016-06-21 22:21:46 +03:00
);
}
return new \OC_Defaults ();
});
2018-01-26 19:46:42 +03:00
$this -> registerService ( JSCombiner :: class , function ( Server $c ) {
return new JSCombiner (
$c -> getAppDataDir ( 'js' ),
$c -> getURLGenerator (),
2018-03-07 16:13:36 +03:00
$this -> getMemCacheFactory (),
2018-01-26 19:46:42 +03:00
$c -> getSystemConfig (),
$c -> getLogger ()
);
});
2019-05-28 20:46:36 +03:00
$this -> registerAlias ( \OCP\EventDispatcher\IEventDispatcher :: class , \OC\EventDispatcher\EventDispatcher :: class );
2020-08-13 08:43:37 +03:00
/** @deprecated 19.0.0 */
2020-02-07 13:39:55 +03:00
$this -> registerDeprecatedAlias ( 'EventDispatcher' , \OC\EventDispatcher\SymfonyAdapter :: class );
2019-05-28 20:46:36 +03:00
$this -> registerAlias ( EventDispatcherInterface :: class , \OC\EventDispatcher\SymfonyAdapter :: class );
2017-03-20 01:14:47 +03:00
2015-07-20 13:59:04 +03:00
$this -> registerService ( 'CryptoWrapper' , function ( Server $c ) {
2015-08-21 19:27:52 +03:00
// FIXME: Instantiiated here due to cyclic dependency
$request = new Request (
[
'get' => $_GET ,
'post' => $_POST ,
'files' => $_FILES ,
'server' => $_SERVER ,
'env' => $_ENV ,
'cookies' => $_COOKIE ,
'method' => ( isset ( $_SERVER ) && isset ( $_SERVER [ 'REQUEST_METHOD' ]))
? $_SERVER [ 'REQUEST_METHOD' ]
: null ,
],
2016-01-09 21:57:03 +03:00
$c -> getSecureRandom (),
2015-08-21 19:27:52 +03:00
$c -> getConfig ()
);
2015-07-20 13:59:04 +03:00
return new CryptoWrapper (
$c -> getConfig (),
$c -> getCrypto (),
2015-08-21 19:27:52 +03:00
$c -> getSecureRandom (),
$request
2015-07-20 13:59:04 +03:00
);
});
2020-08-13 08:43:37 +03:00
/** @deprecated 19.0.0 */
2020-02-07 13:39:55 +03:00
$this -> registerDeprecatedAlias ( 'CsrfTokenManager' , CsrfTokenManager :: class );
2016-10-28 12:29:02 +03:00
$this -> registerService ( SessionStorage :: class , function ( Server $c ) {
return new SessionStorage ( $c -> getSession ());
});
2020-03-18 12:43:54 +03:00
$this -> registerAlias ( \OCP\Security\IContentSecurityPolicyManager :: class , ContentSecurityPolicyManager :: class );
2020-08-13 08:43:37 +03:00
/** @deprecated 19.0.0 */
2020-03-18 12:43:54 +03:00
$this -> registerDeprecatedAlias ( 'ContentSecurityPolicyManager' , ContentSecurityPolicyManager :: class );
2017-03-21 12:00:02 +03:00
2017-08-24 17:21:50 +03:00
$this -> registerService ( \OCP\Share\IManager :: class , function ( Server $c ) {
2016-01-11 12:30:03 +03:00
$config = $c -> getConfig ();
2018-01-26 01:16:13 +03:00
$factoryClass = $config -> getSystemValue ( 'sharing.managerFactory' , ProviderFactory :: class );
2016-05-02 12:59:54 +03:00
/** @var \OCP\Share\IProviderFactory $factory */
2016-01-20 10:30:37 +03:00
$factory = new $factoryClass ( $this );
2016-01-11 12:30:03 +03:00
$manager = new \OC\Share20\Manager (
$c -> getLogger (),
$c -> getConfig (),
$c -> getSecureRandom (),
$c -> getHasher (),
$c -> getMountManager (),
$c -> getGroupManager (),
2017-09-08 11:34:19 +03:00
$c -> getL10N ( 'lib' ),
$c -> getL10NFactory (),
2016-02-02 23:02:09 +03:00
$factory ,
2016-02-04 14:51:23 +03:00
$c -> getUserManager (),
2016-06-24 18:53:37 +03:00
$c -> getLazyRootFolder (),
2017-07-27 00:53:07 +03:00
$c -> getEventDispatcher (),
$c -> getMailer (),
$c -> getURLGenerator (),
2019-12-12 23:38:52 +03:00
$c -> getThemingDefaults (),
$c -> query ( IEventDispatcher :: class )
2016-01-11 12:30:03 +03:00
);
return $manager ;
});
2020-08-13 08:43:37 +03:00
/** @deprecated 19.0.0 */
2020-02-07 13:39:55 +03:00
$this -> registerDeprecatedAlias ( 'ShareManager' , \OCP\Share\IManager :: class );
2017-03-21 12:00:02 +03:00
2020-04-09 14:53:40 +03:00
$this -> registerService ( \OCP\Collaboration\Collaborators\ISearch :: class , function ( Server $c ) {
2017-09-13 15:29:57 +03:00
$instance = new Collaboration\Collaborators\Search ( $c );
// register default plugins
$instance -> registerPlugin ([ 'shareType' => 'SHARE_TYPE_USER' , 'class' => UserPlugin :: class ]);
$instance -> registerPlugin ([ 'shareType' => 'SHARE_TYPE_GROUP' , 'class' => GroupPlugin :: class ]);
$instance -> registerPlugin ([ 'shareType' => 'SHARE_TYPE_EMAIL' , 'class' => MailPlugin :: class ]);
$instance -> registerPlugin ([ 'shareType' => 'SHARE_TYPE_REMOTE' , 'class' => RemotePlugin :: class ]);
2018-07-02 12:29:03 +03:00
$instance -> registerPlugin ([ 'shareType' => 'SHARE_TYPE_REMOTE_GROUP' , 'class' => RemoteGroupPlugin :: class ]);
2017-09-13 15:29:57 +03:00
return $instance ;
2017-08-31 23:47:02 +03:00
});
2020-08-13 08:43:37 +03:00
/** @deprecated 19.0.0 */
2020-02-07 13:39:55 +03:00
$this -> registerDeprecatedAlias ( 'CollaboratorSearch' , \OCP\Collaboration\Collaborators\ISearch :: class );
2018-11-01 12:46:42 +03:00
$this -> registerAlias ( \OCP\Collaboration\Collaborators\ISearchResult :: class , \OC\Collaboration\Collaborators\SearchResult :: class );
2017-08-31 23:47:02 +03:00
2017-10-31 15:55:03 +03:00
$this -> registerAlias ( \OCP\Collaboration\AutoComplete\IManager :: class , \OC\Collaboration\AutoComplete\Manager :: class );
2017-08-30 11:56:02 +03:00
2019-09-29 21:57:00 +03:00
$this -> registerAlias ( \OCP\Collaboration\Resources\IProviderManager :: class , \OC\Collaboration\Resources\ProviderManager :: class );
2019-02-22 15:07:26 +03:00
$this -> registerAlias ( \OCP\Collaboration\Resources\IManager :: class , \OC\Collaboration\Resources\Manager :: class );
2020-09-04 17:39:01 +03:00
$this -> registerDeprecatedAlias ( 'SettingsManager' , \OC\Settings\Manager :: class );
$this -> registerAlias ( \OCP\Settings\IManager :: class , \OC\Settings\Manager :: class );
2016-08-24 13:03:22 +03:00
$this -> registerService ( \OC\Files\AppData\Factory :: class , function ( Server $c ) {
return new \OC\Files\AppData\Factory (
$c -> getRootFolder (),
$c -> getSystemConfig ()
);
});
2016-11-16 13:40:52 +03:00
2016-08-01 19:27:07 +03:00
$this -> registerService ( 'LockdownManager' , function ( Server $c ) {
2017-08-24 17:21:50 +03:00
return new LockdownManager ( function () use ( $c ) {
2017-02-17 17:40:20 +03:00
return $c -> getSession ();
});
2016-08-01 19:27:07 +03:00
});
2016-11-16 13:40:52 +03:00
2017-04-05 23:35:59 +03:00
$this -> registerService ( \OCP\OCS\IDiscoveryService :: class , function ( Server $c ) {
2017-02-24 14:50:43 +03:00
return new DiscoveryService ( $c -> getMemCacheFactory (), $c -> getHTTPClientService ());
});
2017-01-27 14:52:17 +03:00
$this -> registerService ( ICloudIdManager :: class , function ( Server $c ) {
2020-11-16 19:56:44 +03:00
return new CloudIdManager ( $c -> get ( \OCP\Contacts\IManager :: class ));
2017-01-27 14:52:17 +03:00
});
2020-05-02 21:10:59 +03:00
$this -> registerAlias ( \OCP\GlobalScale\IConfig :: class , \OC\GlobalScale\Config :: class );
2018-04-18 17:05:11 +03:00
$this -> registerService ( ICloudFederationProviderManager :: class , function ( Server $c ) {
2018-05-09 18:06:35 +03:00
return new CloudFederationProviderManager ( $c -> getAppManager (), $c -> getHTTPClientService (), $c -> getCloudIdManager (), $c -> getLogger ());
2018-04-18 17:05:11 +03:00
});
$this -> registerService ( ICloudFederationFactory :: class , function ( Server $c ) {
return new CloudFederationFactory ();
});
2017-03-21 12:00:02 +03:00
$this -> registerAlias ( \OCP\AppFramework\Utility\IControllerMethodReflector :: class , \OC\AppFramework\Utility\ControllerMethodReflector :: class );
2020-08-13 08:43:37 +03:00
/** @deprecated 19.0.0 */
2020-02-07 13:39:55 +03:00
$this -> registerDeprecatedAlias ( 'ControllerMethodReflector' , \OCP\AppFramework\Utility\IControllerMethodReflector :: class );
2017-03-21 12:00:02 +03:00
$this -> registerAlias ( \OCP\AppFramework\Utility\ITimeFactory :: class , \OC\AppFramework\Utility\TimeFactory :: class );
2020-08-13 08:43:37 +03:00
/** @deprecated 19.0.0 */
2020-02-07 13:39:55 +03:00
$this -> registerDeprecatedAlias ( 'TimeFactory' , \OCP\AppFramework\Utility\ITimeFactory :: class );
2017-03-21 12:00:02 +03:00
2017-04-07 23:42:43 +03:00
$this -> registerService ( Defaults :: class , function ( Server $c ) {
return new Defaults (
$c -> getThemingDefaults ()
);
});
2020-08-13 08:43:37 +03:00
/** @deprecated 19.0.0 */
2020-02-07 13:39:55 +03:00
$this -> registerDeprecatedAlias ( 'Defaults' , \OCP\Defaults :: class );
2017-04-07 23:42:43 +03:00
2017-08-24 17:21:50 +03:00
$this -> registerService ( \OCP\ISession :: class , function ( SimpleContainer $c ) {
2017-03-21 12:00:02 +03:00
return $c -> query ( \OCP\IUserSession :: class ) -> getSession ();
});
2017-03-20 16:22:06 +03:00
2017-08-24 17:21:50 +03:00
$this -> registerService ( IShareHelper :: class , function ( Server $c ) {
2017-03-20 16:22:06 +03:00
return new ShareHelper (
2017-04-13 15:52:09 +03:00
$c -> query ( \OCP\Share\IManager :: class )
2017-03-20 16:22:06 +03:00
);
});
2017-11-24 12:27:58 +03:00
2020-04-09 14:53:40 +03:00
$this -> registerService ( Installer :: class , function ( Server $c ) {
2017-11-24 12:27:58 +03:00
return new Installer (
$c -> getAppFetcher (),
$c -> getHTTPClientService (),
$c -> getTempManager (),
$c -> getLogger (),
2020-02-12 15:31:11 +03:00
$c -> getConfig (),
\OC :: $CLI
2017-11-24 12:27:58 +03:00
);
});
2017-10-04 17:21:50 +03:00
2020-04-09 14:53:40 +03:00
$this -> registerService ( IApiFactory :: class , function ( Server $c ) {
2017-10-04 17:21:50 +03:00
return new ApiFactory ( $c -> getHTTPClientService ());
});
2020-04-09 14:53:40 +03:00
$this -> registerService ( IInstanceFactory :: class , function ( Server $c ) {
2017-10-04 17:21:50 +03:00
$memcacheFactory = $c -> getMemCacheFactory ();
return new InstanceFactory ( $memcacheFactory -> createLocal ( 'remoteinstance.' ), $c -> getHTTPClientService ());
});
2017-09-27 14:17:34 +03:00
2017-12-10 13:58:33 +03:00
$this -> registerAlias ( IContactsStore :: class , ContactsStore :: class );
2018-10-24 13:53:43 +03:00
$this -> registerAlias ( IAccountManager :: class , AccountManager :: class );
2017-09-16 14:42:46 +03:00
2020-08-11 23:38:14 +03:00
$this -> registerAlias ( IStorageFactory :: class , StorageFactory :: class );
2018-09-19 20:02:15 +03:00
2018-11-01 21:14:58 +03:00
$this -> registerAlias ( IDashboardManager :: class , DashboardManager :: class );
2020-05-27 10:07:17 +03:00
$this -> registerAlias ( \OCP\Dashboard\IManager :: class , \OC\Dashboard\Manager :: class );
2018-10-30 20:24:15 +03:00
$this -> registerAlias ( IFullTextSearchManager :: class , FullTextSearchManager :: class );
2018-10-15 20:25:09 +03:00
2019-01-29 12:38:05 +03:00
$this -> registerAlias ( ISubAdmin :: class , SubAdmin :: class );
2019-01-17 14:30:47 +03:00
$this -> registerAlias ( IInitialStateService :: class , InitialStateService :: class );
2020-08-04 20:34:55 +03:00
$this -> registerAlias ( \OCP\UserStatus\IManager :: class , \OC\UserStatus\Manager :: class );
2017-09-27 14:17:34 +03:00
$this -> connectDispatcher ();
2013-08-27 01:48:18 +04:00
}
2020-04-22 16:21:15 +03:00
public function boot () {
/** @var HookConnector $hookConnector */
$hookConnector = $this -> query ( HookConnector :: class );
$hookConnector -> viewToNode ();
}
2017-10-31 19:06:01 +03:00
/**
* @ return \OCP\Calendar\IManager
2020-09-16 16:09:00 +03:00
* @ deprecated 20.0 . 0
2017-10-31 19:06:01 +03:00
*/
public function getCalendarManager () {
2020-03-18 12:43:54 +03:00
return $this -> query ( \OC\Calendar\Manager :: class );
2017-10-31 19:06:01 +03:00
}
2018-06-18 15:33:25 +03:00
/**
* @ return \OCP\Calendar\Resource\IManager
2020-09-16 16:09:00 +03:00
* @ deprecated 20.0 . 0
2018-06-18 15:33:25 +03:00
*/
public function getCalendarResourceBackendManager () {
2020-03-18 12:43:54 +03:00
return $this -> query ( \OC\Calendar\Resource\Manager :: class );
2018-06-18 15:33:25 +03:00
}
/**
* @ return \OCP\Calendar\Room\IManager
2020-09-16 16:09:00 +03:00
* @ deprecated 20.0 . 0
2018-06-18 15:33:25 +03:00
*/
public function getCalendarRoomBackendManager () {
2020-03-18 12:43:54 +03:00
return $this -> query ( \OC\Calendar\Room\Manager :: class );
2018-06-18 15:33:25 +03:00
}
2017-09-27 14:17:34 +03:00
private function connectDispatcher () {
$dispatcher = $this -> getEventDispatcher ();
// Delete avatar on user deletion
2020-04-09 14:53:40 +03:00
$dispatcher -> addListener ( 'OCP\IUser::preDelete' , function ( GenericEvent $e ) {
2017-09-27 14:17:34 +03:00
$logger = $this -> getLogger ();
$manager = $this -> getAvatarManager ();
/** @var IUser $user */
$user = $e -> getSubject ();
try {
$avatar = $manager -> getAvatar ( $user -> getUID ());
$avatar -> remove ();
2017-12-11 18:39:44 +03:00
} catch ( NotFoundException $e ) {
// no avatar to remove
2017-09-27 14:17:34 +03:00
} catch ( \Exception $e ) {
// Ignore exceptions
$logger -> info ( 'Could not cleanup avatar of ' . $user -> getUID ());
}
});
2017-12-13 22:21:00 +03:00
$dispatcher -> addListener ( 'OCP\IUser::changeUser' , function ( GenericEvent $e ) {
$manager = $this -> getAvatarManager ();
/** @var IUser $user */
$user = $e -> getSubject ();
$feature = $e -> getArgument ( 'feature' );
$oldValue = $e -> getArgument ( 'oldValue' );
$value = $e -> getArgument ( 'value' );
2019-04-09 12:23:06 +03:00
// We only change the avatar on display name changes
if ( $feature !== 'displayName' ) {
return ;
}
2017-12-13 22:21:00 +03:00
try {
$avatar = $manager -> getAvatar ( $user -> getUID ());
$avatar -> userChanged ( $feature , $oldValue , $value );
} catch ( NotFoundException $e ) {
// no avatar to remove
}
});
2020-03-07 18:18:21 +03:00
/** @var IEventDispatcher $eventDispatched */
$eventDispatched = $this -> query ( IEventDispatcher :: class );
$eventDispatched -> addServiceListener ( LoginFailed :: class , LoginFailedListener :: class );
2020-08-31 20:45:40 +03:00
$eventDispatched -> addServiceListener ( PostLoginEvent :: class , UserLoggedInListener :: class );
2017-09-27 14:17:34 +03:00
}
2013-08-27 01:48:18 +04:00
/**
2013-08-31 23:34:29 +04:00
* @ return \OCP\Contacts\IManager
2020-09-16 16:09:00 +03:00
* @ deprecated 20.0 . 0
2013-08-27 01:48:18 +04:00
*/
2015-04-18 12:46:29 +03:00
public function getContactsManager () {
2020-03-18 12:43:54 +03:00
return $this -> query ( \OCP\Contacts\IManager :: class );
2013-08-27 01:48:18 +04:00
}
2013-08-31 23:34:29 +04:00
2015-01-14 22:39:23 +03:00
/**
* @ return \OC\Encryption\Manager
2020-09-16 16:09:00 +03:00
* @ deprecated 20.0 . 0
2015-01-14 22:39:23 +03:00
*/
2015-04-18 12:46:29 +03:00
public function getEncryptionManager () {
2020-03-18 12:43:54 +03:00
return $this -> query ( \OCP\Encryption\IManager :: class );
2015-01-14 22:39:23 +03:00
}
2015-03-31 17:23:31 +03:00
/**
* @ return \OC\Encryption\File
2020-09-16 16:09:00 +03:00
* @ deprecated 20.0 . 0
2015-03-31 17:23:31 +03:00
*/
2015-04-18 12:46:29 +03:00
public function getEncryptionFilesHelper () {
2015-03-31 17:23:31 +03:00
return $this -> query ( 'EncryptionFileHelper' );
}
2015-01-14 22:39:23 +03:00
/**
* @ return \OCP\Encryption\Keys\IStorage
2020-09-16 16:09:00 +03:00
* @ deprecated 20.0 . 0
2015-01-14 22:39:23 +03:00
*/
2015-04-22 12:18:18 +03:00
public function getEncryptionKeyStorage () {
return $this -> query ( 'EncryptionKeyStorage' );
2015-01-14 22:39:23 +03:00
}
2013-08-31 23:34:29 +04:00
/**
2013-09-17 19:46:33 +04:00
* The current request object holding all information about the request
* currently being processed is returned from this method .
2013-08-31 23:34:29 +04:00
* In case the current execution was not initiated by a web request null is returned
*
2015-04-01 13:13:49 +03:00
* @ return \OCP\IRequest
2020-09-16 16:09:00 +03:00
* @ deprecated 20.0 . 0
2013-08-31 23:34:29 +04:00
*/
2015-04-18 12:46:29 +03:00
public function getRequest () {
2020-03-18 12:43:54 +03:00
return $this -> query ( IRequest :: class );
2013-08-31 23:34:29 +04:00
}
2013-09-05 01:45:11 +04:00
/**
* Returns the preview manager which can create preview images for a given file
*
2020-03-18 12:43:54 +03:00
* @ return IPreview
2020-09-16 16:09:00 +03:00
* @ deprecated 20.0 . 0
2013-09-05 01:45:11 +04:00
*/
2015-04-18 12:46:29 +03:00
public function getPreviewManager () {
2020-03-18 12:43:54 +03:00
return $this -> query ( IPreview :: class );
2013-09-05 01:45:11 +04:00
}
2013-09-16 00:24:57 +04:00
2013-09-18 02:37:00 +04:00
/**
* Returns the tag manager which can get and set tags for different object types
*
2013-09-24 19:10:01 +04:00
* @ see \OCP\ITagManager :: load ()
2020-03-18 12:43:54 +03:00
* @ return ITagManager
2020-09-16 16:09:00 +03:00
* @ deprecated 20.0 . 0
2013-09-18 02:37:00 +04:00
*/
2015-04-18 12:46:29 +03:00
public function getTagManager () {
2020-03-18 12:43:54 +03:00
return $this -> query ( ITagManager :: class );
2013-09-18 02:37:00 +04:00
}
2013-09-16 00:24:57 +04:00
2015-11-26 17:49:14 +03:00
/**
* Returns the system - tag manager
*
2020-03-18 12:43:54 +03:00
* @ return ISystemTagManager
2015-11-26 17:49:14 +03:00
*
* @ since 9.0 . 0
2020-09-16 16:09:00 +03:00
* @ deprecated 20.0 . 0
2015-11-26 17:49:14 +03:00
*/
public function getSystemTagManager () {
2020-03-18 12:43:54 +03:00
return $this -> query ( ISystemTagManager :: class );
2015-11-26 17:49:14 +03:00
}
/**
* Returns the system - tag object mapper
*
2020-03-18 12:43:54 +03:00
* @ return ISystemTagObjectMapper
2015-11-26 17:49:14 +03:00
*
* @ since 9.0 . 0
2020-09-16 16:09:00 +03:00
* @ deprecated 20.0 . 0
2015-11-26 17:49:14 +03:00
*/
public function getSystemTagObjectMapper () {
2020-03-18 12:43:54 +03:00
return $this -> query ( ISystemTagObjectMapper :: class );
2015-11-26 17:49:14 +03:00
}
2013-09-20 13:46:11 +04:00
/**
* Returns the avatar manager , used for avatar functionality
*
2020-03-18 12:43:54 +03:00
* @ return IAvatarManager
2020-09-16 16:09:00 +03:00
* @ deprecated 20.0 . 0
2013-09-20 13:46:11 +04:00
*/
2015-04-18 12:46:29 +03:00
public function getAvatarManager () {
2020-03-18 12:43:54 +03:00
return $this -> query ( IAvatarManager :: class );
2013-09-20 13:46:11 +04:00
}
2013-09-16 00:24:57 +04:00
/**
* Returns the root folder of ownCloud ' s data directory
*
2020-03-18 12:43:54 +03:00
* @ return IRootFolder
2020-09-16 16:09:00 +03:00
* @ deprecated 20.0 . 0
2013-09-16 00:24:57 +04:00
*/
2015-04-18 12:46:29 +03:00
public function getRootFolder () {
2020-03-18 12:43:54 +03:00
return $this -> query ( IRootFolder :: class );
2013-09-16 00:24:57 +04:00
}
2013-09-17 19:46:33 +04:00
2016-03-11 16:00:36 +03:00
/**
* Returns the root folder of ownCloud ' s data directory
* This is the lazy variant so this gets only initialized once it
* is actually used .
*
2020-03-18 12:43:54 +03:00
* @ return IRootFolder
2020-09-16 16:09:00 +03:00
* @ deprecated 20.0 . 0
2016-03-11 16:00:36 +03:00
*/
public function getLazyRootFolder () {
2020-03-18 12:43:54 +03:00
return $this -> query ( IRootFolder :: class );
2016-03-11 16:00:36 +03:00
}
2013-09-18 16:25:12 +04:00
/**
* Returns a view to ownCloud ' s files folder
*
2014-08-31 11:49:19 +04:00
* @ param string $userId user ID
2016-02-16 20:45:25 +03:00
* @ return \OCP\Files\Folder | null
2020-09-16 16:09:00 +03:00
* @ deprecated 20.0 . 0
2013-09-18 16:25:12 +04:00
*/
2015-04-18 12:46:29 +03:00
public function getUserFolder ( $userId = null ) {
2014-10-03 03:16:57 +04:00
if ( $userId === null ) {
2014-08-31 11:49:19 +04:00
$user = $this -> getUserSession () -> getUser ();
if ( ! $user ) {
return null ;
}
$userId = $user -> getUID ();
2014-07-25 19:52:50 +04:00
}
2013-09-18 16:25:12 +04:00
$root = $this -> getRootFolder ();
2015-06-16 17:02:30 +03:00
return $root -> getUserFolder ( $userId );
2013-09-18 16:25:12 +04:00
}
2013-09-20 14:45:56 +04:00
/**
* @ return \OC\User\Manager
2020-09-16 16:09:00 +03:00
* @ deprecated 20.0 . 0
2013-09-20 14:45:56 +04:00
*/
2015-04-18 12:46:29 +03:00
public function getUserManager () {
2020-03-18 12:43:54 +03:00
return $this -> query ( IUserManager :: class );
2013-09-20 14:45:56 +04:00
}
2014-07-16 16:25:31 +04:00
/**
* @ return \OC\Group\Manager
2020-09-16 16:09:00 +03:00
* @ deprecated 20.0 . 0
2014-07-16 16:25:31 +04:00
*/
2015-04-18 12:46:29 +03:00
public function getGroupManager () {
2020-03-18 12:43:54 +03:00
return $this -> query ( IGroupManager :: class );
2014-07-16 16:25:31 +04:00
}
2013-09-20 14:45:56 +04:00
/**
* @ return \OC\User\Session
2020-09-16 16:09:00 +03:00
* @ deprecated 20.0 . 0
2013-09-20 14:45:56 +04:00
*/
2015-04-18 12:46:29 +03:00
public function getUserSession () {
2020-03-18 12:43:54 +03:00
return $this -> query ( IUserSession :: class );
2013-09-20 14:45:56 +04:00
}
2014-07-16 21:40:22 +04:00
/**
* @ return \OCP\ISession
2020-09-16 16:09:00 +03:00
* @ deprecated 20.0 . 0
2014-07-16 21:40:22 +04:00
*/
2015-04-18 12:46:29 +03:00
public function getSession () {
2020-03-18 12:43:54 +03:00
return $this -> getUserSession () -> getSession ();
2014-07-16 21:40:22 +04:00
}
/**
* @ param \OCP\ISession $session
*/
2015-04-18 12:46:29 +03:00
public function setSession ( \OCP\ISession $session ) {
2016-10-28 12:29:02 +03:00
$this -> query ( SessionStorage :: class ) -> setSession ( $session );
2020-03-18 12:43:54 +03:00
$this -> getUserSession () -> setSession ( $session );
2016-11-19 18:33:19 +03:00
$this -> query ( Store :: class ) -> setSession ( $session );
2014-07-16 21:40:22 +04:00
}
2016-05-11 12:23:25 +03:00
/**
* @ return \OC\Authentication\TwoFactorAuth\Manager
2020-09-16 16:09:00 +03:00
* @ deprecated 20.0 . 0
2016-05-11 12:23:25 +03:00
*/
public function getTwoFactorAuthManager () {
2020-03-18 12:43:54 +03:00
return $this -> query ( \OC\Authentication\TwoFactorAuth\Manager :: class );
2016-05-11 12:23:25 +03:00
}
2013-09-20 19:34:33 +04:00
/**
* @ return \OC\NavigationManager
2020-09-16 16:09:00 +03:00
* @ deprecated 20.0 . 0
2013-09-20 19:34:33 +04:00
*/
2015-04-18 12:46:29 +03:00
public function getNavigationManager () {
2020-03-18 12:43:54 +03:00
return $this -> query ( INavigationManager :: class );
2013-09-20 19:34:33 +04:00
}
2013-09-20 22:21:24 +04:00
/**
2013-12-31 17:36:02 +04:00
* @ return \OCP\IConfig
2020-09-16 16:09:00 +03:00
* @ deprecated 20.0 . 0
2013-09-20 22:21:24 +04:00
*/
2015-04-18 12:46:29 +03:00
public function getConfig () {
2020-02-07 13:39:55 +03:00
return $this -> query ( AllConfig :: class );
2013-09-20 22:21:24 +04:00
}
2013-09-24 02:09:21 +04:00
2014-11-27 18:40:12 +03:00
/**
* @ return \OC\SystemConfig
2020-09-16 16:09:00 +03:00
* @ deprecated 20.0 . 0
2014-11-27 18:40:12 +03:00
*/
2015-04-18 12:46:29 +03:00
public function getSystemConfig () {
2020-02-07 13:39:55 +03:00
return $this -> query ( SystemConfig :: class );
2014-11-27 18:40:12 +03:00
}
2014-02-07 16:42:18 +04:00
/**
* Returns the app config manager
*
2020-03-18 12:43:54 +03:00
* @ return IAppConfig
2020-09-16 16:09:00 +03:00
* @ deprecated 20.0 . 0
2014-02-07 16:42:18 +04:00
*/
2015-04-18 12:46:29 +03:00
public function getAppConfig () {
2020-03-18 12:43:54 +03:00
return $this -> query ( IAppConfig :: class );
2014-02-07 16:42:18 +04:00
}
2015-08-27 14:14:50 +03:00
/**
2020-03-18 12:43:54 +03:00
* @ return IFactory
2020-09-16 16:09:00 +03:00
* @ deprecated 20.0 . 0
2015-08-27 14:14:50 +03:00
*/
public function getL10NFactory () {
2020-03-18 12:43:54 +03:00
return $this -> query ( IFactory :: class );
2015-08-27 14:14:50 +03:00
}
2013-09-25 20:34:01 +04:00
/**
* get an L10N instance
2014-07-16 16:25:31 +04:00
*
2014-03-01 00:03:43 +04:00
* @ param string $app appid
2014-08-31 12:05:59 +04:00
* @ param string $lang
2016-04-14 16:38:00 +03:00
* @ return IL10N
2020-09-16 16:09:00 +03:00
* @ deprecated 20.0 . 0
2013-09-25 20:34:01 +04:00
*/
2015-04-18 12:46:29 +03:00
public function getL10N ( $app , $lang = null ) {
2015-08-27 14:14:50 +03:00
return $this -> getL10NFactory () -> get ( $app , $lang );
2013-09-25 20:34:01 +04:00
}
2013-09-26 20:41:19 +04:00
/**
2020-03-18 12:43:54 +03:00
* @ return IURLGenerator
2020-09-16 16:09:00 +03:00
* @ deprecated 20.0 . 0
2013-09-26 20:41:19 +04:00
*/
2015-04-18 12:46:29 +03:00
public function getURLGenerator () {
2020-03-18 12:43:54 +03:00
return $this -> query ( IURLGenerator :: class );
2013-09-26 20:41:19 +04:00
}
2016-10-31 13:07:54 +03:00
/**
* @ return AppFetcher
2020-09-16 16:09:00 +03:00
* @ deprecated 20.0 . 0
2016-10-31 13:07:54 +03:00
*/
public function getAppFetcher () {
2017-05-10 10:56:38 +03:00
return $this -> query ( AppFetcher :: class );
2016-10-31 13:07:54 +03:00
}
2013-09-17 19:46:33 +04:00
/**
2015-05-13 12:58:19 +03:00
* Returns an ICache instance . Since 8.1 . 0 it returns a fake cache . Use
* getMemCacheFactory () instead .
2013-09-17 19:46:33 +04:00
*
2020-03-18 12:43:54 +03:00
* @ return ICache
2015-05-13 12:58:19 +03:00
* @ deprecated 8.1 . 0 use getMemCacheFactory to obtain a proper cache
2013-09-17 19:46:33 +04:00
*/
2015-04-18 12:46:29 +03:00
public function getCache () {
2020-03-18 12:43:54 +03:00
return $this -> query ( ICache :: class );
2013-09-17 19:46:33 +04:00
}
2014-01-06 15:55:56 +04:00
/**
2014-01-08 18:51:40 +04:00
* Returns an \OCP\CacheFactory instance
2014-01-06 15:55:56 +04:00
*
2014-03-24 17:55:03 +04:00
* @ return \OCP\ICacheFactory
2020-09-16 16:09:00 +03:00
* @ deprecated 20.0 . 0
2014-01-06 15:55:56 +04:00
*/
2015-04-18 12:46:29 +03:00
public function getMemCacheFactory () {
2020-03-18 12:43:54 +03:00
return $this -> query ( Factory :: class );
2014-01-06 15:55:56 +04:00
}
2016-04-14 16:41:04 +03:00
/**
* Returns an \OC\RedisFactory instance
*
* @ return \OC\RedisFactory
2020-09-16 16:09:00 +03:00
* @ deprecated 20.0 . 0
2016-04-14 16:41:04 +03:00
*/
public function getGetRedisFactory () {
return $this -> query ( 'RedisFactory' );
}
2013-09-17 20:31:14 +04:00
/**
* Returns the current session
2013-09-20 16:33:45 +04:00
*
* @ return \OCP\IDBConnection
2020-09-16 16:09:00 +03:00
* @ deprecated 20.0 . 0
2013-09-20 16:33:45 +04:00
*/
2015-04-18 12:46:29 +03:00
public function getDatabaseConnection () {
2020-03-18 12:43:54 +03:00
return $this -> query ( IDBConnection :: class );
2013-09-20 16:33:45 +04:00
}
2013-09-29 22:31:12 +04:00
/**
* Returns the activity manager
*
* @ return \OCP\Activity\IManager
2020-09-16 16:09:00 +03:00
* @ deprecated 20.0 . 0
2013-09-29 22:31:12 +04:00
*/
2015-04-18 12:46:29 +03:00
public function getActivityManager () {
2020-03-18 12:43:54 +03:00
return $this -> query ( \OCP\Activity\IManager :: class );
2013-09-20 16:33:45 +04:00
}
2014-02-11 17:00:24 +04:00
/**
* Returns an job list for controlling background jobs
*
2020-03-18 12:43:54 +03:00
* @ return IJobList
2020-09-16 16:09:00 +03:00
* @ deprecated 20.0 . 0
2014-02-11 17:00:24 +04:00
*/
2015-04-18 12:46:29 +03:00
public function getJobList () {
2020-03-18 12:43:54 +03:00
return $this -> query ( IJobList :: class );
2014-02-11 17:00:24 +04:00
}
2014-03-10 17:04:58 +04:00
2014-05-07 03:55:06 +04:00
/**
* Returns a logger instance
*
2020-03-18 12:43:54 +03:00
* @ return ILogger
2020-09-16 16:09:00 +03:00
* @ deprecated 20.0 . 0
2014-05-07 03:55:06 +04:00
*/
2015-04-18 12:46:29 +03:00
public function getLogger () {
2020-03-18 12:43:54 +03:00
return $this -> query ( ILogger :: class );
2014-05-07 03:55:06 +04:00
}
2018-04-25 03:27:43 +03:00
/**
* @ return ILogFactory
* @ throws \OCP\AppFramework\QueryException
2020-09-16 16:09:00 +03:00
* @ deprecated 20.0 . 0
2018-04-25 03:27:43 +03:00
*/
public function getLogFactory () {
2018-04-27 00:54:11 +03:00
return $this -> query ( ILogFactory :: class );
2018-04-25 03:27:43 +03:00
}
2014-03-10 17:04:58 +04:00
/**
* Returns a router for generating and matching urls
*
2020-03-18 12:43:54 +03:00
* @ return IRouter
2020-09-16 16:09:00 +03:00
* @ deprecated 20.0 . 0
2014-03-10 17:04:58 +04:00
*/
2015-04-18 12:46:29 +03:00
public function getRouter () {
2020-03-18 12:43:54 +03:00
return $this -> query ( IRouter :: class );
2014-03-10 17:04:58 +04:00
}
2014-04-19 21:30:12 +04:00
2014-06-06 03:17:02 +04:00
/**
* Returns a search instance
2014-07-16 16:25:31 +04:00
*
2020-03-18 12:43:54 +03:00
* @ return ISearch
2020-09-16 16:09:00 +03:00
* @ deprecated 20.0 . 0
2014-06-06 03:17:02 +04:00
*/
2015-04-18 12:46:29 +03:00
public function getSearch () {
2020-03-18 12:43:54 +03:00
return $this -> query ( ISearch :: class );
2014-06-06 03:17:02 +04:00
}
2014-04-19 21:30:12 +04:00
2014-08-26 21:02:40 +04:00
/**
* Returns a SecureRandom instance
*
* @ return \OCP\Security\ISecureRandom
2020-09-16 16:09:00 +03:00
* @ deprecated 20.0 . 0
2014-08-26 21:02:40 +04:00
*/
2015-04-18 12:46:29 +03:00
public function getSecureRandom () {
2020-03-18 12:43:54 +03:00
return $this -> query ( ISecureRandom :: class );
2014-08-26 21:02:40 +04:00
}
/**
* Returns a Crypto instance
*
2020-03-18 12:43:54 +03:00
* @ return ICrypto
2020-09-16 16:09:00 +03:00
* @ deprecated 20.0 . 0
2014-08-26 21:02:40 +04:00
*/
2015-04-18 12:46:29 +03:00
public function getCrypto () {
2020-03-18 12:43:54 +03:00
return $this -> query ( ICrypto :: class );
2014-08-26 21:02:40 +04:00
}
2014-11-04 18:05:31 +03:00
/**
* Returns a Hasher instance
*
2020-03-18 12:43:54 +03:00
* @ return IHasher
2020-09-16 16:09:00 +03:00
* @ deprecated 20.0 . 0
2014-11-04 18:05:31 +03:00
*/
2015-04-18 12:46:29 +03:00
public function getHasher () {
2020-03-18 12:43:54 +03:00
return $this -> query ( IHasher :: class );
2014-11-04 18:05:31 +03:00
}
2015-08-24 18:13:16 +03:00
/**
* Returns a CredentialsManager instance
*
2020-03-18 12:43:54 +03:00
* @ return ICredentialsManager
2020-09-16 16:09:00 +03:00
* @ deprecated 20.0 . 0
2015-08-24 18:13:16 +03:00
*/
public function getCredentialsManager () {
2020-03-18 12:43:54 +03:00
return $this -> query ( ICredentialsManager :: class );
2015-08-24 18:13:16 +03:00
}
2014-08-14 16:24:10 +04:00
/**
* Get the certificate manager for the user
*
2015-12-22 19:42:28 +03:00
* @ param string $userId ( optional ) if not specified the current loggedin user is used , use null to get the system certificate manager
2015-06-17 16:47:45 +03:00
* @ return \OCP\ICertificateManager | null if $uid is null and no user is logged in
2020-09-16 16:09:00 +03:00
* @ deprecated 20.0 . 0
2014-08-14 16:24:10 +04:00
*/
2015-12-22 19:42:28 +03:00
public function getCertificateManager ( $userId = '' ) {
if ( $userId === '' ) {
2014-08-14 16:24:10 +04:00
$userSession = $this -> getUserSession ();
$user = $userSession -> getUser ();
if ( is_null ( $user )) {
return null ;
}
2015-06-19 11:23:04 +03:00
$userId = $user -> getUID ();
2014-08-14 16:24:10 +04:00
}
2017-05-19 23:51:26 +03:00
return new CertificateManager (
$userId ,
new View (),
$this -> getConfig (),
$this -> getLogger (),
$this -> getSecureRandom ()
);
2014-08-14 16:24:10 +04:00
}
2014-08-29 19:19:38 +04:00
2015-03-16 13:28:23 +03:00
/**
* Returns an instance of the HTTP client service
*
2020-03-18 12:43:54 +03:00
* @ return IClientService
2020-09-16 16:09:00 +03:00
* @ deprecated 20.0 . 0
2015-03-16 13:28:23 +03:00
*/
2015-04-18 12:46:29 +03:00
public function getHTTPClientService () {
2020-03-18 12:43:54 +03:00
return $this -> query ( IClientService :: class );
2015-03-16 13:28:23 +03:00
}
2014-08-29 19:19:38 +04:00
/**
2014-09-04 03:10:02 +04:00
* Create a new event source
2014-08-29 19:19:38 +04:00
*
* @ return \OCP\IEventSource
2020-09-16 16:09:00 +03:00
* @ deprecated 20.0 . 0
2014-08-29 19:19:38 +04:00
*/
2015-04-18 12:46:29 +03:00
public function createEventSource () {
2014-08-29 19:19:38 +04:00
return new \OC_EventSource ();
}
2014-10-03 03:16:57 +04:00
/**
* Get the active event logger
*
* The returned logger only logs data when debug mode is enabled
*
2020-03-18 12:43:54 +03:00
* @ return IEventLogger
2020-09-16 16:09:00 +03:00
* @ deprecated 20.0 . 0
2014-10-03 03:16:57 +04:00
*/
2015-04-18 12:46:29 +03:00
public function getEventLogger () {
2020-03-18 12:43:54 +03:00
return $this -> query ( IEventLogger :: class );
2014-10-03 03:16:57 +04:00
}
2014-10-03 03:35:07 +04:00
/**
* Get the active query logger
*
* The returned logger only logs data when debug mode is enabled
*
2020-03-18 12:43:54 +03:00
* @ return IQueryLogger
2020-09-16 16:09:00 +03:00
* @ deprecated 20.0 . 0
2014-10-03 03:35:07 +04:00
*/
2015-04-18 12:46:29 +03:00
public function getQueryLogger () {
2020-03-18 12:43:54 +03:00
return $this -> query ( IQueryLogger :: class );
2014-10-03 03:35:07 +04:00
}
2014-10-22 19:33:36 +04:00
/**
* Get the manager for temporary files and folders
*
* @ return \OCP\ITempManager
2020-09-16 16:09:00 +03:00
* @ deprecated 20.0 . 0
2014-10-22 19:33:36 +04:00
*/
2015-04-18 12:46:29 +03:00
public function getTempManager () {
2020-03-18 12:43:54 +03:00
return $this -> query ( ITempManager :: class );
2014-10-22 19:33:36 +04:00
}
2014-11-07 16:26:12 +03:00
/**
* Get the app manager
*
* @ return \OCP\App\IAppManager
2020-09-16 16:09:00 +03:00
* @ deprecated 20.0 . 0
2014-11-07 16:26:12 +03:00
*/
2015-04-18 12:46:29 +03:00
public function getAppManager () {
2020-03-18 12:43:54 +03:00
return $this -> query ( IAppManager :: class );
2014-11-07 16:26:12 +03:00
}
2014-11-27 16:36:11 +03:00
2015-02-12 15:53:27 +03:00
/**
* Creates a new mailer
*
2020-03-18 12:43:54 +03:00
* @ return IMailer
2020-09-16 16:09:00 +03:00
* @ deprecated 20.0 . 0
2015-02-12 15:53:27 +03:00
*/
2015-04-18 12:46:29 +03:00
public function getMailer () {
2020-03-18 12:43:54 +03:00
return $this -> query ( IMailer :: class );
2015-02-12 15:53:27 +03:00
}
2014-11-27 16:36:11 +03:00
/**
* Get the webroot
*
* @ return string
2020-09-16 16:09:00 +03:00
* @ deprecated 20.0 . 0
2014-11-27 16:36:11 +03:00
*/
2015-04-18 12:46:29 +03:00
public function getWebRoot () {
2014-11-27 16:50:14 +03:00
return $this -> webRoot ;
2014-11-27 16:36:11 +03:00
}
2014-11-24 17:54:42 +03:00
2015-03-30 16:58:20 +03:00
/**
* @ return \OC\OCSClient
2020-09-16 16:09:00 +03:00
* @ deprecated 20.0 . 0
2015-03-30 16:58:20 +03:00
*/
public function getOcsClient () {
return $this -> query ( 'OcsClient' );
}
2014-11-24 18:37:04 +03:00
/**
2020-03-18 12:43:54 +03:00
* @ return IDateTimeZone
2020-09-16 16:09:00 +03:00
* @ deprecated 20.0 . 0
2014-11-24 18:37:04 +03:00
*/
2014-12-16 17:34:55 +03:00
public function getDateTimeZone () {
2020-03-18 12:43:54 +03:00
return $this -> query ( IDateTimeZone :: class );
2014-12-16 17:34:55 +03:00
}
/**
2020-03-18 12:43:54 +03:00
* @ return IDateTimeFormatter
2020-09-16 16:09:00 +03:00
* @ deprecated 20.0 . 0
2014-12-16 17:34:55 +03:00
*/
public function getDateTimeFormatter () {
2020-03-18 12:43:54 +03:00
return $this -> query ( IDateTimeFormatter :: class );
2014-11-24 18:37:04 +03:00
}
2014-11-24 17:54:42 +03:00
/**
2020-03-18 12:43:54 +03:00
* @ return IMountProviderCollection
2020-09-16 16:09:00 +03:00
* @ deprecated 20.0 . 0
2014-11-24 17:54:42 +03:00
*/
2015-12-03 16:10:05 +03:00
public function getMountProviderCollection () {
2020-03-18 12:43:54 +03:00
return $this -> query ( IMountProviderCollection :: class );
2014-11-24 17:54:42 +03:00
}
2014-12-05 21:56:29 +03:00
/**
* Get the IniWrapper
*
2014-12-05 21:57:06 +03:00
* @ return IniGetWrapper
2020-09-16 16:09:00 +03:00
* @ deprecated 20.0 . 0
2014-12-05 21:56:29 +03:00
*/
public function getIniWrapper () {
2020-08-20 15:08:18 +03:00
return $this -> query ( IniGetWrapper :: class );
2014-12-05 21:56:29 +03:00
}
2015-02-17 00:12:47 +03:00
2015-02-17 18:49:14 +03:00
/**
* @ return \OCP\Command\IBus
2020-09-16 16:09:00 +03:00
* @ deprecated 20.0 . 0
2015-02-17 18:49:14 +03:00
*/
2015-12-03 16:10:05 +03:00
public function getCommandBus () {
2015-02-17 18:49:14 +03:00
return $this -> query ( 'AsyncCommandBus' );
}
2015-02-17 00:12:47 +03:00
/**
* Get the trusted domain helper
*
* @ return TrustedDomainHelper
2020-09-16 16:09:00 +03:00
* @ deprecated 20.0 . 0
2015-02-17 00:12:47 +03:00
*/
public function getTrustedDomainHelper () {
2020-09-10 10:03:39 +03:00
return $this -> query ( TrustedDomainHelper :: class );
2015-02-17 00:12:47 +03:00
}
2015-05-04 15:02:27 +03:00
/**
* Get the locking provider
*
2020-03-18 12:43:54 +03:00
* @ return ILockingProvider
2015-05-04 15:02:27 +03:00
* @ since 8.1 . 0
2020-09-16 16:09:00 +03:00
* @ deprecated 20.0 . 0
2015-05-04 15:02:27 +03:00
*/
public function getLockingProvider () {
2020-03-18 12:43:54 +03:00
return $this -> query ( ILockingProvider :: class );
2015-05-04 15:02:27 +03:00
}
2015-07-01 16:57:04 +03:00
/**
2020-03-18 12:43:54 +03:00
* @ return IMountManager
2020-09-16 16:09:00 +03:00
* @ deprecated 20.0 . 0
2015-07-01 16:57:04 +03:00
**/
2020-04-10 17:51:06 +03:00
public function getMountManager () {
2020-03-18 12:43:54 +03:00
return $this -> query ( IMountManager :: class );
2015-07-01 16:57:04 +03:00
}
2015-04-09 16:19:57 +03:00
2020-03-18 12:43:54 +03:00
/**
* @ return IUserMountCache
2020-09-16 16:09:00 +03:00
* @ deprecated 20.0 . 0
2020-03-18 12:43:54 +03:00
*/
2020-04-10 17:51:06 +03:00
public function getUserMountCache () {
2020-03-18 12:43:54 +03:00
return $this -> query ( IUserMountCache :: class );
2016-08-15 14:38:02 +03:00
}
2016-05-03 11:30:07 +03:00
/**
2015-04-09 16:19:57 +03:00
* Get the MimeTypeDetector
*
2020-03-18 12:43:54 +03:00
* @ return IMimeTypeDetector
2020-09-16 16:09:00 +03:00
* @ deprecated 20.0 . 0
2015-04-09 16:19:57 +03:00
*/
public function getMimeTypeDetector () {
2020-03-18 12:43:54 +03:00
return $this -> query ( IMimeTypeDetector :: class );
2015-04-09 16:19:57 +03:00
}
2015-03-21 22:03:56 +03:00
2015-09-03 21:48:42 +03:00
/**
* Get the MimeTypeLoader
*
2020-03-18 12:43:54 +03:00
* @ return IMimeTypeLoader
2020-09-16 16:09:00 +03:00
* @ deprecated 20.0 . 0
2015-09-03 21:48:42 +03:00
*/
public function getMimeTypeLoader () {
2020-03-18 12:43:54 +03:00
return $this -> query ( IMimeTypeLoader :: class );
2015-09-03 21:48:42 +03:00
}
2015-03-21 22:03:56 +03:00
/**
* Get the manager of all the capabilities
*
2020-03-18 12:43:54 +03:00
* @ return CapabilitiesManager
2020-09-16 16:09:00 +03:00
* @ deprecated 20.0 . 0
2015-03-21 22:03:56 +03:00
*/
public function getCapabilitiesManager () {
2020-03-18 12:43:54 +03:00
return $this -> query ( CapabilitiesManager :: class );
2015-03-21 22:03:56 +03:00
}
2015-08-14 16:40:15 +03:00
/**
* Get the EventDispatcher
*
* @ return EventDispatcherInterface
* @ since 8.2 . 0
2019-12-11 12:04:36 +03:00
* @ deprecated 18.0 . 0 use \OCP\EventDispatcher\IEventDispatcher
2015-08-14 16:40:15 +03:00
*/
public function getEventDispatcher () {
2019-05-28 20:46:36 +03:00
return $this -> query ( \OC\EventDispatcher\SymfonyAdapter :: class );
2015-08-14 16:40:15 +03:00
}
2015-08-21 19:27:52 +03:00
2015-08-31 13:24:37 +03:00
/**
* Get the Notification Manager
*
2016-01-14 16:35:24 +03:00
* @ return \OCP\Notification\IManager
2015-08-31 13:24:37 +03:00
* @ since 8.2 . 0
2020-09-16 16:09:00 +03:00
* @ deprecated 20.0 . 0
2015-08-31 13:24:37 +03:00
*/
public function getNotificationManager () {
2020-03-18 12:43:54 +03:00
return $this -> query ( \OCP\Notification\IManager :: class );
2015-08-31 13:24:37 +03:00
}
2015-12-03 18:35:57 +03:00
/**
2020-03-18 12:43:54 +03:00
* @ return ICommentsManager
2020-09-16 16:09:00 +03:00
* @ deprecated 20.0 . 0
2015-12-03 18:35:57 +03:00
*/
2015-11-24 01:53:55 +03:00
public function getCommentsManager () {
2020-03-18 12:43:54 +03:00
return $this -> query ( ICommentsManager :: class );
2015-11-24 01:53:55 +03:00
}
2016-06-21 22:21:46 +03:00
/**
2017-04-07 15:51:05 +03:00
* @ return \OCA\Theming\ThemingDefaults
2020-09-16 16:09:00 +03:00
* @ deprecated 20.0 . 0
2016-06-21 22:21:46 +03:00
*/
public function getThemingDefaults () {
return $this -> query ( 'ThemingDefaults' );
}
Add code integrity check
This PR implements the base foundation of the code signing and integrity check. In this PR implemented is the signing and verification logic, as well as commands to sign single apps or the core repository.
Furthermore, there is a basic implementation to display problems with the code integrity on the update screen.
Code signing basically happens the following way:
- There is a ownCloud Root Certificate authority stored `resources/codesigning/root.crt` (in this PR I also ship the private key which we obviously need to change before a release :wink:). This certificate is not intended to be used for signing directly and only is used to sign new certificates.
- Using the `integrity:sign-core` and `integrity:sign-app` commands developers can sign either the core release or a single app. The core release needs to be signed with a certificate that has a CN of `core`, apps need to be signed with a certificate that either has a CN of `core` (shipped apps!) or the AppID.
- The command generates a signature.json file of the following format:
```json
{
"hashes": {
"/filename.php": "2401fed2eea6f2c1027c482a633e8e25cd46701f811e2d2c10dc213fd95fa60e350bccbbebdccc73a042b1a2799f673fbabadc783284cc288e4f1a1eacb74e3d",
"/lib/base.php": "55548cc16b457cd74241990cc9d3b72b6335f2e5f45eee95171da024087d114fcbc2effc3d5818a6d5d55f2ae960ab39fd0414d0c542b72a3b9e08eb21206dd9"
},
"certificate": "-----BEGIN CERTIFICATE-----MIIBvTCCASagAwIBAgIUPvawyqJwCwYazcv7iz16TWxfeUMwDQYJKoZIhvcNAQEF\nBQAwIzEhMB8GA1UECgwYb3duQ2xvdWQgQ29kZSBTaWduaW5nIENBMB4XDTE1MTAx\nNDEzMTcxMFoXDTE2MTAxNDEzMTcxMFowEzERMA8GA1UEAwwIY29udGFjdHMwgZ8w\nDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANoQesGdCW0L2L+a2xITYipixkScrIpB\nkX5Snu3fs45MscDb61xByjBSlFgR4QI6McoCipPw4SUr28EaExVvgPSvqUjYLGps\nfiv0Cvgquzbx/X3mUcdk9LcFo1uWGtrTfkuXSKX41PnJGTr6RQWGIBd1V52q1qbC\nJKkfzyeMeuQfAgMBAAEwDQYJKoZIhvcNAQEFBQADgYEAvF/KIhRMQ3tYTmgHWsiM\nwDMgIDb7iaHF0fS+/Nvo4PzoTO/trev6tMyjLbJ7hgdCpz/1sNzE11Cibf6V6dsz\njCE9invP368Xv0bTRObRqeSNsGogGl5ceAvR0c9BG+NRIKHcly3At3gLkS2791bC\niG+UxI/MNcWV0uJg9S63LF8=\n-----END CERTIFICATE-----",
"signature": "U29tZVNpZ25lZERhdGFFeGFtcGxl"
}
```
`hashes` is an array of all files in the folder with their corresponding SHA512 hashes (this is actually quite cheap to calculate), the `certificate` is the certificate used for signing. It has to be issued by the ownCloud Root Authority and it's CN needs to be permitted to perform the required action. The `signature` is then a signature of the `hashes` which can be verified using the `certificate`.
Steps to do in other PRs, this is already a quite huge one:
- Add nag screen in case the code check fails to ensure that administrators are aware of this.
- Add code verification also to OCC upgrade and unify display code more.
- Add enforced code verification to apps shipped from the appstore with a level of "official"
- Add enfocrced code verification to apps shipped from the appstore that were already signed in a previous release
- Add some developer documentation on how devs can request their own certificate
- Check when installing ownCloud
- Add support for CRLs to allow revoking certificates
**Note:** The upgrade checks are only run when the instance has a defined release channel of `stable` (defined in `version.php`). If you want to test this, you need to change the channel thus and then generate the core signature:
```
➜ master git:(add-integrity-checker) ✗ ./occ integrity:sign-core --privateKey=resources/codesigning/core.key --certificate=resources/codesigning/core.crt
Successfully signed "core"
```
Then increase the version and you should see something like the following:
![2015-11-04_12-02-57](https://cloud.githubusercontent.com/assets/878997/10936336/6adb1d14-82ec-11e5-8f06-9a74801c9abf.png)
As you can see a failed code check will not prevent the further update. It will instead just be a notice to the admin. In a next step we will add some nag screen.
For packaging stable releases this requires the following additional steps as a last action before zipping:
1. Run `./occ integrity:sign-core` once
2. Run `./occ integrity:sign-app` _for each_ app. However, this can be simply automated using a simple foreach on the apps folder.
2015-11-03 22:26:06 +03:00
/**
* @ return \OC\IntegrityCheck\Checker
2020-09-16 16:09:00 +03:00
* @ deprecated 20.0 . 0
Add code integrity check
This PR implements the base foundation of the code signing and integrity check. In this PR implemented is the signing and verification logic, as well as commands to sign single apps or the core repository.
Furthermore, there is a basic implementation to display problems with the code integrity on the update screen.
Code signing basically happens the following way:
- There is a ownCloud Root Certificate authority stored `resources/codesigning/root.crt` (in this PR I also ship the private key which we obviously need to change before a release :wink:). This certificate is not intended to be used for signing directly and only is used to sign new certificates.
- Using the `integrity:sign-core` and `integrity:sign-app` commands developers can sign either the core release or a single app. The core release needs to be signed with a certificate that has a CN of `core`, apps need to be signed with a certificate that either has a CN of `core` (shipped apps!) or the AppID.
- The command generates a signature.json file of the following format:
```json
{
"hashes": {
"/filename.php": "2401fed2eea6f2c1027c482a633e8e25cd46701f811e2d2c10dc213fd95fa60e350bccbbebdccc73a042b1a2799f673fbabadc783284cc288e4f1a1eacb74e3d",
"/lib/base.php": "55548cc16b457cd74241990cc9d3b72b6335f2e5f45eee95171da024087d114fcbc2effc3d5818a6d5d55f2ae960ab39fd0414d0c542b72a3b9e08eb21206dd9"
},
"certificate": "-----BEGIN CERTIFICATE-----MIIBvTCCASagAwIBAgIUPvawyqJwCwYazcv7iz16TWxfeUMwDQYJKoZIhvcNAQEF\nBQAwIzEhMB8GA1UECgwYb3duQ2xvdWQgQ29kZSBTaWduaW5nIENBMB4XDTE1MTAx\nNDEzMTcxMFoXDTE2MTAxNDEzMTcxMFowEzERMA8GA1UEAwwIY29udGFjdHMwgZ8w\nDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANoQesGdCW0L2L+a2xITYipixkScrIpB\nkX5Snu3fs45MscDb61xByjBSlFgR4QI6McoCipPw4SUr28EaExVvgPSvqUjYLGps\nfiv0Cvgquzbx/X3mUcdk9LcFo1uWGtrTfkuXSKX41PnJGTr6RQWGIBd1V52q1qbC\nJKkfzyeMeuQfAgMBAAEwDQYJKoZIhvcNAQEFBQADgYEAvF/KIhRMQ3tYTmgHWsiM\nwDMgIDb7iaHF0fS+/Nvo4PzoTO/trev6tMyjLbJ7hgdCpz/1sNzE11Cibf6V6dsz\njCE9invP368Xv0bTRObRqeSNsGogGl5ceAvR0c9BG+NRIKHcly3At3gLkS2791bC\niG+UxI/MNcWV0uJg9S63LF8=\n-----END CERTIFICATE-----",
"signature": "U29tZVNpZ25lZERhdGFFeGFtcGxl"
}
```
`hashes` is an array of all files in the folder with their corresponding SHA512 hashes (this is actually quite cheap to calculate), the `certificate` is the certificate used for signing. It has to be issued by the ownCloud Root Authority and it's CN needs to be permitted to perform the required action. The `signature` is then a signature of the `hashes` which can be verified using the `certificate`.
Steps to do in other PRs, this is already a quite huge one:
- Add nag screen in case the code check fails to ensure that administrators are aware of this.
- Add code verification also to OCC upgrade and unify display code more.
- Add enforced code verification to apps shipped from the appstore with a level of "official"
- Add enfocrced code verification to apps shipped from the appstore that were already signed in a previous release
- Add some developer documentation on how devs can request their own certificate
- Check when installing ownCloud
- Add support for CRLs to allow revoking certificates
**Note:** The upgrade checks are only run when the instance has a defined release channel of `stable` (defined in `version.php`). If you want to test this, you need to change the channel thus and then generate the core signature:
```
➜ master git:(add-integrity-checker) ✗ ./occ integrity:sign-core --privateKey=resources/codesigning/core.key --certificate=resources/codesigning/core.crt
Successfully signed "core"
```
Then increase the version and you should see something like the following:
![2015-11-04_12-02-57](https://cloud.githubusercontent.com/assets/878997/10936336/6adb1d14-82ec-11e5-8f06-9a74801c9abf.png)
As you can see a failed code check will not prevent the further update. It will instead just be a notice to the admin. In a next step we will add some nag screen.
For packaging stable releases this requires the following additional steps as a last action before zipping:
1. Run `./occ integrity:sign-core` once
2. Run `./occ integrity:sign-app` _for each_ app. However, this can be simply automated using a simple foreach on the apps folder.
2015-11-03 22:26:06 +03:00
*/
public function getIntegrityCodeChecker () {
return $this -> query ( 'IntegrityCodeChecker' );
}
2015-08-21 19:27:52 +03:00
/**
* @ return \OC\Session\CryptoWrapper
2020-09-16 16:09:00 +03:00
* @ deprecated 20.0 . 0
2015-08-21 19:27:52 +03:00
*/
public function getSessionCryptoWrapper () {
return $this -> query ( 'CryptoWrapper' );
}
2015-08-31 17:18:26 +03:00
2016-01-25 19:15:54 +03:00
/**
* @ return CsrfTokenManager
2020-09-16 16:09:00 +03:00
* @ deprecated 20.0 . 0
2016-01-25 19:15:54 +03:00
*/
public function getCsrfTokenManager () {
2019-07-08 18:44:55 +03:00
return $this -> query ( CsrfTokenManager :: class );
2016-01-25 19:15:54 +03:00
}
2016-07-20 19:36:15 +03:00
/**
* @ return Throttler
2020-09-16 16:09:00 +03:00
* @ deprecated 20.0 . 0
2016-07-20 19:36:15 +03:00
*/
public function getBruteForceThrottler () {
2020-03-18 12:43:54 +03:00
return $this -> query ( Throttler :: class );
2016-07-20 19:36:15 +03:00
}
2016-01-28 16:33:02 +03:00
/**
* @ return IContentSecurityPolicyManager
2020-09-16 16:09:00 +03:00
* @ deprecated 20.0 . 0
2016-01-28 16:33:02 +03:00
*/
public function getContentSecurityPolicyManager () {
2020-03-18 12:43:54 +03:00
return $this -> query ( ContentSecurityPolicyManager :: class );
2016-01-28 16:33:02 +03:00
}
2016-10-24 17:31:06 +03:00
/**
* @ return ContentSecurityPolicyNonceManager
2020-09-16 16:09:00 +03:00
* @ deprecated 20.0 . 0
2016-10-24 17:31:06 +03:00
*/
public function getContentSecurityPolicyNonceManager () {
2020-08-11 23:38:14 +03:00
return $this -> query ( ContentSecurityPolicyNonceManager :: class );
2016-10-24 17:31:06 +03:00
}
2015-08-31 17:18:26 +03:00
/**
* Not a public API as of 8.2 , wait for 9.0
2015-12-03 16:10:05 +03:00
*
2015-08-31 17:18:26 +03:00
* @ return \OCA\Files_External\Service\BackendService
2020-09-16 16:09:00 +03:00
* @ deprecated 20.0 . 0
2015-08-31 17:18:26 +03:00
*/
public function getStoragesBackendService () {
2020-03-18 12:43:54 +03:00
return $this -> query ( BackendService :: class );
2015-08-31 17:18:26 +03:00
}
/**
* Not a public API as of 8.2 , wait for 9.0
2015-12-03 16:10:05 +03:00
*
2015-08-31 17:18:26 +03:00
* @ return \OCA\Files_External\Service\GlobalStoragesService
2020-09-16 16:09:00 +03:00
* @ deprecated 20.0 . 0
2015-08-31 17:18:26 +03:00
*/
public function getGlobalStoragesService () {
2020-03-18 12:43:54 +03:00
return $this -> query ( GlobalStoragesService :: class );
2015-08-31 17:18:26 +03:00
}
/**
* Not a public API as of 8.2 , wait for 9.0
2015-12-03 16:10:05 +03:00
*
2015-08-31 17:18:26 +03:00
* @ return \OCA\Files_External\Service\UserGlobalStoragesService
2020-09-16 16:09:00 +03:00
* @ deprecated 20.0 . 0
2015-08-31 17:18:26 +03:00
*/
public function getUserGlobalStoragesService () {
2020-03-18 12:43:54 +03:00
return $this -> query ( UserGlobalStoragesService :: class );
2015-08-31 17:18:26 +03:00
}
/**
* Not a public API as of 8.2 , wait for 9.0
2015-12-03 16:10:05 +03:00
*
2015-08-31 17:18:26 +03:00
* @ return \OCA\Files_External\Service\UserStoragesService
2020-09-16 16:09:00 +03:00
* @ deprecated 20.0 . 0
2015-08-31 17:18:26 +03:00
*/
public function getUserStoragesService () {
2020-03-18 12:43:54 +03:00
return $this -> query ( UserStoragesService :: class );
2015-08-31 17:18:26 +03:00
}
2016-01-11 12:30:03 +03:00
/**
2016-01-27 16:48:52 +03:00
* @ return \OCP\Share\IManager
2020-09-16 16:09:00 +03:00
* @ deprecated 20.0 . 0
2016-01-11 12:30:03 +03:00
*/
public function getShareManager () {
2020-03-18 12:43:54 +03:00
return $this -> query ( \OCP\Share\IManager :: class );
2016-01-11 12:30:03 +03:00
}
2015-12-03 16:10:05 +03:00
2017-08-31 23:47:02 +03:00
/**
* @ return \OCP\Collaboration\Collaborators\ISearch
2020-09-16 16:09:00 +03:00
* @ deprecated 20.0 . 0
2017-08-31 23:47:02 +03:00
*/
public function getCollaboratorSearch () {
2020-03-18 12:43:54 +03:00
return $this -> query ( \OCP\Collaboration\Collaborators\ISearch :: class );
2017-08-31 23:47:02 +03:00
}
2017-08-30 11:56:02 +03:00
/**
* @ return \OCP\Collaboration\AutoComplete\IManager
2020-09-16 16:09:00 +03:00
* @ deprecated 20.0 . 0
2017-08-30 11:56:02 +03:00
*/
2020-04-09 14:53:40 +03:00
public function getAutoCompleteManager () {
2017-10-31 15:55:03 +03:00
return $this -> query ( IManager :: class );
2017-08-30 11:56:02 +03:00
}
2016-07-22 11:46:29 +03:00
/**
* Returns the LDAP Provider
*
* @ return \OCP\LDAP\ILDAPProvider
2020-09-16 16:09:00 +03:00
* @ deprecated 20.0 . 0
2016-07-22 11:46:29 +03:00
*/
public function getLDAPProvider () {
return $this -> query ( 'LDAPProvider' );
}
2016-08-09 00:31:26 +03:00
/**
* @ return \OCP\Settings\IManager
2020-09-16 16:09:00 +03:00
* @ deprecated 20.0 . 0
2016-08-09 00:31:26 +03:00
*/
public function getSettingsManager () {
2020-09-04 17:39:01 +03:00
return $this -> query ( \OC\Settings\Manager :: class );
2016-08-09 00:31:26 +03:00
}
2016-08-24 13:03:22 +03:00
/**
* @ return \OCP\Files\IAppData
2020-09-16 16:09:00 +03:00
* @ deprecated 20.0 . 0
2016-08-24 13:03:22 +03:00
*/
public function getAppDataDir ( $app ) {
/** @var \OC\Files\AppData\Factory $factory */
$factory = $this -> query ( \OC\Files\AppData\Factory :: class );
return $factory -> get ( $app );
}
2016-08-01 19:27:07 +03:00
/**
* @ return \OCP\Lockdown\ILockdownManager
2020-09-16 16:09:00 +03:00
* @ deprecated 20.0 . 0
2016-08-01 19:27:07 +03:00
*/
public function getLockdownManager () {
return $this -> query ( 'LockdownManager' );
}
2017-01-27 14:52:17 +03:00
/**
* @ return \OCP\Federation\ICloudIdManager
2020-09-16 16:09:00 +03:00
* @ deprecated 20.0 . 0
2017-01-27 14:52:17 +03:00
*/
public function getCloudIdManager () {
return $this -> query ( ICloudIdManager :: class );
}
2017-10-04 17:21:50 +03:00
2018-04-18 17:05:11 +03:00
/**
* @ return \OCP\GlobalScale\IConfig
2020-09-16 16:09:00 +03:00
* @ deprecated 20.0 . 0
2018-04-18 17:05:11 +03:00
*/
public function getGlobalScaleConfig () {
return $this -> query ( IConfig :: class );
}
/**
* @ return \OCP\Federation\ICloudFederationProviderManager
2020-09-16 16:09:00 +03:00
* @ deprecated 20.0 . 0
2018-04-18 17:05:11 +03:00
*/
public function getCloudFederationProviderManager () {
return $this -> query ( ICloudFederationProviderManager :: class );
}
2017-10-04 17:21:50 +03:00
/**
* @ return \OCP\Remote\Api\IApiFactory
2020-09-16 16:09:00 +03:00
* @ deprecated 20.0 . 0
2017-10-04 17:21:50 +03:00
*/
public function getRemoteApiFactory () {
return $this -> query ( IApiFactory :: class );
}
2018-04-18 17:05:11 +03:00
/**
* @ return \OCP\Federation\ICloudFederationFactory
2020-09-16 16:09:00 +03:00
* @ deprecated 20.0 . 0
2018-04-18 17:05:11 +03:00
*/
public function getCloudFederationFactory () {
return $this -> query ( ICloudFederationFactory :: class );
}
2017-10-04 17:21:50 +03:00
/**
* @ return \OCP\Remote\IInstanceFactory
2020-09-16 16:09:00 +03:00
* @ deprecated 20.0 . 0
2017-10-04 17:21:50 +03:00
*/
public function getRemoteInstanceFactory () {
return $this -> query ( IInstanceFactory :: class );
}
2018-09-19 20:02:15 +03:00
/**
* @ return IStorageFactory
2020-09-16 16:09:00 +03:00
* @ deprecated 20.0 . 0
2018-09-19 20:02:15 +03:00
*/
public function getStorageFactory () {
return $this -> query ( IStorageFactory :: class );
}
2019-07-03 13:02:31 +03:00
/**
* Get the Preview GeneratorHelper
*
* @ return GeneratorHelper
* @ since 17.0 . 0
2020-09-16 16:09:00 +03:00
* @ deprecated 20.0 . 0
2019-07-03 13:02:31 +03:00
*/
public function getGeneratorHelper () {
return $this -> query ( \OC\Preview\GeneratorHelper :: class );
}
2020-02-07 13:37:04 +03:00
private function registerDeprecatedAlias ( string $alias , string $target ) {
2020-07-13 12:18:14 +03:00
$this -> registerService ( $alias , function ( ContainerInterface $container ) use ( $target , $alias ) {
2020-02-07 13:37:04 +03:00
try {
/** @var ILogger $logger */
2020-07-13 12:18:14 +03:00
$logger = $container -> get ( ILogger :: class );
2020-02-07 13:37:04 +03:00
$logger -> debug ( 'The requested alias "' . $alias . '" is depreacted. Please request "' . $target . '" directly. This alias will be removed in a future Nextcloud version.' , [ 'app' => 'serverDI' ]);
2020-07-13 12:18:14 +03:00
} catch ( ContainerExceptionInterface $e ) {
2020-02-07 13:37:04 +03:00
// Could not get logger. Continue
}
2020-07-13 12:18:14 +03:00
return $container -> get ( $target );
2020-02-07 13:37:04 +03:00
}, false );
}
2013-08-21 02:58:15 +04:00
}