7272use OCP \IURLGenerator ;
7373use OCP \IUser ;
7474use OCP \IUserManager ;
75+ use OCP \Security \ISecureRandom ;
7576use OCP \Share ;
7677use OCP \Share \Exceptions \ShareNotFound ;
7778use OCP \Share \IManager as ShareManager ;
8485 * @package OCA\Files_Sharing\Controllers
8586 */
8687class ShareController extends AuthPublicShareController {
88+ protected IConfig $ config ;
89+ protected IUserManager $ userManager ;
90+ protected ILogger $ logger ;
91+ protected \OCP \Activity \IManager $ activityManager ;
92+ protected IPreview $ previewManager ;
93+ protected IRootFolder $ rootFolder ;
94+ protected FederatedShareProvider $ federatedShareProvider ;
95+ protected IAccountManager $ accountManager ;
96+ protected IEventDispatcher $ eventDispatcher ;
97+ protected IL10N $ l10n ;
98+ protected Defaults $ defaults ;
99+ protected ShareManager $ shareManager ;
100+ protected ISecureRandom $ secureRandom ;
101+ protected ?Share \IShare $ share = null ;
87102
88- /** @var IConfig */
89- protected $ config ;
90- /** @var IUserManager */
91- protected $ userManager ;
92- /** @var ILogger */
93- protected $ logger ;
94- /** @var \OCP\Activity\IManager */
95- protected $ activityManager ;
96- /** @var IPreview */
97- protected $ previewManager ;
98- /** @var IRootFolder */
99- protected $ rootFolder ;
100- /** @var FederatedShareProvider */
101- protected $ federatedShareProvider ;
102- /** @var IAccountManager */
103- protected $ accountManager ;
104- /** @var IEventDispatcher */
105- protected $ eventDispatcher ;
106- /** @var IL10N */
107- protected $ l10n ;
108- /** @var Defaults */
109- protected $ defaults ;
110- /** @var ShareManager */
111- protected $ shareManager ;
112-
113- /** @var Share\IShare */
114- protected $ share ;
115-
116- /**
117- * @param string $appName
118- * @param IRequest $request
119- * @param IConfig $config
120- * @param IURLGenerator $urlGenerator
121- * @param IUserManager $userManager
122- * @param ILogger $logger
123- * @param \OCP\Activity\IManager $activityManager
124- * @param \OCP\Share\IManager $shareManager
125- * @param ISession $session
126- * @param IPreview $previewManager
127- * @param IRootFolder $rootFolder
128- * @param FederatedShareProvider $federatedShareProvider
129- * @param IAccountManager $accountManager
130- * @param IEventDispatcher $eventDispatcher
131- * @param IL10N $l10n
132- * @param Defaults $defaults
133- */
134103 public function __construct (string $ appName ,
135104 IRequest $ request ,
136105 IConfig $ config ,
@@ -146,6 +115,7 @@ public function __construct(string $appName,
146115 IAccountManager $ accountManager ,
147116 IEventDispatcher $ eventDispatcher ,
148117 IL10N $ l10n ,
118+ ISecureRandom $ secureRandom ,
149119 Defaults $ defaults ) {
150120 parent ::__construct ($ appName , $ request , $ session , $ urlGenerator );
151121
@@ -159,6 +129,7 @@ public function __construct(string $appName,
159129 $ this ->accountManager = $ accountManager ;
160130 $ this ->eventDispatcher = $ eventDispatcher ;
161131 $ this ->l10n = $ l10n ;
132+ $ this ->secureRandom = $ secureRandom ;
162133 $ this ->defaults = $ defaults ;
163134 $ this ->shareManager = $ shareManager ;
164135 }
@@ -209,6 +180,56 @@ protected function showAuthFailed(): TemplateResponse {
209180 return $ response ;
210181 }
211182
183+ /**
184+ * The template to show after user identification
185+ */
186+ protected function showIdentificationResult (bool $ success = false ): TemplateResponse {
187+ $ templateParameters = ['share ' => $ this ->share , 'identityOk ' => $ success ];
188+
189+ $ this ->eventDispatcher ->dispatchTyped (new BeforeTemplateRenderedEvent ($ this ->share , BeforeTemplateRenderedEvent::SCOPE_PUBLIC_SHARE_AUTH ));
190+
191+ $ response = new TemplateResponse ('core ' , 'publicshareauth ' , $ templateParameters , 'guest ' );
192+ if ($ this ->share ->getSendPasswordByTalk ()) {
193+ $ csp = new ContentSecurityPolicy ();
194+ $ csp ->addAllowedConnectDomain ('* ' );
195+ $ csp ->addAllowedMediaDomain ('blob: ' );
196+ $ response ->setContentSecurityPolicy ($ csp );
197+ }
198+
199+ return $ response ;
200+ }
201+
202+ /**
203+ * Validate the identity token of a public share
204+ *
205+ * @param ?string $identityToken
206+ * @return bool
207+ */
208+ protected function validateIdentity (?string $ identityToken = null ): bool {
209+
210+ if ($ this ->share ->getShareType () !== IShare::TYPE_EMAIL ) {
211+ return false ;
212+ }
213+
214+ if ($ identityToken === null || $ this ->share ->getSharedWith () === null ) {
215+ return false ;
216+ }
217+
218+ return $ identityToken === $ this ->share ->getSharedWith ();
219+ }
220+
221+ /**
222+ * Generates a password for the share, respecting any password policy defined
223+ */
224+ protected function generatePassword (): void {
225+ $ event = new \OCP \Security \Events \GenerateSecurePasswordEvent ();
226+ $ this ->eventDispatcher ->dispatchTyped ($ event );
227+ $ password = $ event ->getPassword () ?? $ this ->secureRandom ->generate (20 );
228+
229+ $ this ->share ->setPassword ($ password );
230+ $ this ->shareManager ->updateShare ($ this ->share );
231+ }
232+
212233 protected function verifyPassword (string $ password ): bool {
213234 return $ this ->shareManager ->checkPassword ($ this ->share , $ password );
214235 }
0 commit comments