55 * SPDX-FileCopyrightText: 2016 ownCloud, Inc.
66 * SPDX-License-Identifier: AGPL-3.0-only
77 */
8+
9+ use OC \Files \Filesystem ;
810use OC \ServerNotAvailableException ;
911use OCP \HintException ;
12+ use OCP \IConfig ;
1013use OCP \Server ;
14+ use OCP \Share ;
1115use Psr \Log \LoggerInterface ;
1216
1317class OC_Hook {
1418 public static $ thrownExceptions = [];
1519
16- private static $ registered = [];
20+ private static array $ registered = [];
21+
22+ private static array $ allowList = [
23+ [Filesystem::CLASSNAME , Filesystem::signal_create],
24+ [Filesystem::CLASSNAME , Filesystem::signal_update],
25+ [Filesystem::CLASSNAME , Filesystem::signal_write],
26+ [Filesystem::CLASSNAME , Filesystem::signal_post_create],
27+ [Filesystem::CLASSNAME , Filesystem::signal_post_update],
28+ [Filesystem::CLASSNAME , Filesystem::signal_post_write],
29+ [Filesystem::CLASSNAME , Filesystem::signal_create],
30+ [Filesystem::CLASSNAME , Filesystem::signal_update],
31+ [Filesystem::CLASSNAME , Filesystem::signal_write],
32+ [Filesystem::CLASSNAME , Filesystem::signal_post_create],
33+ [Filesystem::CLASSNAME , Filesystem::signal_post_update],
34+ [Filesystem::CLASSNAME , Filesystem::signal_post_write],
35+ [Filesystem::CLASSNAME , Filesystem::signal_delete_mount],
36+ [Filesystem::CLASSNAME , Filesystem::signal_create_mount],
37+ [Filesystem::CLASSNAME , Filesystem::signal_setup],
38+ [Filesystem::CLASSNAME , Filesystem::signal_pre_setup],
39+ [Filesystem::CLASSNAME , Filesystem::signal_post_init_mountpoints],
40+ [Filesystem::CLASSNAME , 'umount ' ],
41+ ['\OCA\Files_Sharing\API\Server2Server ' , 'preLoginNameUsedAsUserName ' ],
42+ [Share::class,'share_link_access ' ],
43+ [Share::class,'pre_unshare ' ],
44+ [Share::class,'post_unshare ' ],
45+ [Share::class,'post_unshareFromSelf ' ],
46+ [Share::class,'pre_shared ' ],
47+ [Share::class,'post_shared ' ],
48+ ['\OC\Share ' ,'verifyExpirationDate ' ],
49+ [Share::class,'post_set_expiration_date ' ],
50+ [Share::class,'post_update_password ' ],
51+ [Share::class,'post_update_permissions ' ],
52+ ['\OC\Files\Storage\Shared ' ,'fopen ' ],
53+ ['\OC\Files\Storage\Shared ' ,'file_get_contents ' ],
54+ ['\OC\Files\Storage\Shared ' ,'file_put_contents ' ],
55+ ['\OCA\Files_Trashbin\Trashbin ' ,'post_moveToTrash ' ],
56+ ['\OCA\Files_Trashbin\Trashbin ' ,'post_restore ' ],
57+ ['\OCP\Trashbin ' ,'preDeleteAll ' ],
58+ ['\OCP\Trashbin ' ,'deleteAll ' ],
59+ ['\OCP\Versions ' ,'rollback ' ],
60+ ['\OCP\Versions ' ,'preDelete ' ],
61+ ['\OCP\Versions ' ,'delete ' ],
62+ ['OC_User ' ,'pre_createUser ' ],
63+ ['OC_User ' ,'post_createUser ' ],
64+ ['OC_User ' ,'pre_deleteUser ' ],
65+ ['OC_User ' ,'post_deleteUser ' ],
66+ ['OC_User ' ,'pre_setPassword ' ],
67+ ['OC_User ' ,'post_setPassword ' ],
68+ ['OC_User ' ,'pre_login ' ],
69+ ['OC_User ' ,'post_login ' ],
70+ ['OC_User ' ,'logout ' ],
71+ ['OC_User ' ,'changeUser ' ],
72+ ['\OC\User ' ,'assignedUserId ' ],
73+ ['\OC\User ' ,'preUnassignedUserId ' ],
74+ ['\OC\User ' ,'postUnassignedUserId ' ],
75+ ['\OC\Files\Cache\Scanner ' ,'scan_file ' ],
76+ ['\OC\Files\Cache\Scanner ' ,'post_scan_file ' ],
77+ ['Scanner ' ,'removeFromCache ' ],
78+ ['Scanner ' ,'addToCache ' ],
79+ ['Scanner ' ,'correctFolderSize ' ],
80+ ['\OC\Core\LostPassword\Controller\LostController ' ,'post_passwordReset ' ],
81+ ['\OC\Core\LostPassword\Controller\LostController ' ,'pre_passwordReset ' ],
82+ ['\OCA\Files_Sharing\API\Server2Server ' ,'preLoginNameUsedAsUserName ' ],
83+ ];
1784
1885 /**
1986 * connects a function to a hook
@@ -29,6 +96,20 @@ class OC_Hook {
2996 * TODO: write example
3097 */
3198 public static function connect ($ signalClass , $ signalName , $ slotClass , $ slotName ) {
99+ static $ debug = null ;
100+ if ($ debug === null ) {
101+ $ debug = Server::get (IConfig::class)->getSystemValueBool ('debug ' );
102+ }
103+ if ($ debug ) {
104+ $ found = array_find (self ::$ allowList , function ($ allowed ) use ($ signalClass , $ signalName ) {
105+ [$ allowedClass , $ allowedSignal ] = $ allowed ;
106+ return $ allowedClass === $ signalClass && $ allowedSignal === $ signalName ;
107+ }) !== null ;
108+
109+ if (!$ found ) {
110+ throw new \RuntimeException ("The signal $ signalClass:: $ signalName is no longer emitted in server. Listening to it is NOOP. " );
111+ }
112+ }
32113 // If we're trying to connect to an emitting class that isn't
33114 // yet registered, register it
34115 if (!array_key_exists ($ signalClass , self ::$ registered )) {
0 commit comments