2929 */
3030namespace OCA \DAV \Connector \Sabre ;
3131
32- use Exception ;
3332use OC \AppFramework \Http \Request ;
3433use OC \Authentication \Exceptions \PasswordLoginForbiddenException ;
3534use OC \Authentication \TwoFactorAuth \Manager ;
3635use OC \Authentication \AccountModule \Manager as AccountModuleManager ;
36+ use OC \Security \SignedUrl \Verifier ;
3737use OC \User \LoginException ;
3838use OC \User \Session ;
3939use OCA \DAV \Connector \Sabre \Exception \PasswordLoginForbidden ;
4040use OCP \Authentication \Exceptions \AccountCheckException ;
41+ use OCP \IConfig ;
4142use OCP \IRequest ;
4243use OCP \ISession ;
4344use Sabre \DAV \Auth \Backend \AbstractBasic ;
4748use Sabre \HTTP \ResponseInterface ;
4849
4950class Auth extends AbstractBasic {
50- const DAV_AUTHENTICATED = 'AUTHENTICATED_TO_DAV_BACKEND ' ;
51+ public const DAV_AUTHENTICATED = 'AUTHENTICATED_TO_DAV_BACKEND ' ;
5152
5253 /** @var ISession */
5354 private $ session ;
5455 /** @var Session */
5556 private $ userSession ;
5657 /** @var IRequest */
5758 private $ request ;
58- /** @var string */
59- private $ currentUser ;
6059 /** @var Manager */
6160 private $ twoFactorManager ;
6261 /** @var AccountModuleManager */
6362 private $ accountModuleManager ;
63+ /**
64+ * @var IConfig
65+ */
66+ private $ config ;
6467
6568 /**
6669 * @param ISession $session
6770 * @param Session $userSession
6871 * @param IRequest $request
6972 * @param Manager $twoFactorManager
7073 * @param AccountModuleManager $accountModuleManager
74+ * @param IConfig $config
7175 * @param string $principalPrefix
7276 */
7377 public function __construct (ISession $ session ,
7478 Session $ userSession ,
7579 IRequest $ request ,
7680 Manager $ twoFactorManager ,
7781 AccountModuleManager $ accountModuleManager ,
82+ IConfig $ config ,
7883 $ principalPrefix = 'principals/users/ ' ) {
7984 $ this ->session = $ session ;
8085 $ this ->userSession = $ userSession ;
@@ -86,6 +91,7 @@ public function __construct(ISession $session,
8691 // setup realm
8792 $ defaults = new \OC_Defaults ();
8893 $ this ->realm = $ defaults ->getName ();
94+ $ this ->config = $ config ;
8995 }
9096
9197 /**
@@ -158,7 +164,7 @@ public function check(RequestInterface $request, ResponseInterface $response) {
158164 throw new NotAuthenticated ($ e ->getMessage (), $ e ->getCode (), $ e );
159165 } catch (NotAuthenticated $ e ) {
160166 throw $ e ;
161- } catch (Exception $ e ) {
167+ } catch (\ Exception $ e ) {
162168 $ class = \get_class ($ e );
163169 $ msg = $ e ->getMessage ();
164170 throw new ServiceUnavailable ("$ class: $ msg " );
@@ -205,6 +211,7 @@ private function requiresCSRFCheck() {
205211 * @return array
206212 * @throws NotAuthenticated
207213 * @throws ServiceUnavailable
214+ * @throws LoginException
208215 */
209216 private function auth (RequestInterface $ request , ResponseInterface $ response ) {
210217 $ forcedLogout = false ;
@@ -230,7 +237,6 @@ private function auth(RequestInterface $request, ResponseInterface $response) {
230237 $ this ->checkAccountModule ($ user );
231238 $ uid = $ user ->getUID ();
232239 \OC_Util::setupFS ($ uid );
233- $ this ->currentUser = $ uid ;
234240 $ this ->session ->close ();
235241 return [true , $ this ->principalPrefix . $ uid ];
236242 }
@@ -246,14 +252,37 @@ private function auth(RequestInterface $request, ResponseInterface $response) {
246252 $ startPos = \strrpos ($ data [1 ], '/ ' ) + 1 ;
247253 $ data [1 ] = \substr_replace ($ data [1 ], $ user ->getUID (), $ startPos );
248254 }
255+
256+ // signed url handling
257+ $ verifier = new Verifier ($ request , $ this ->config );
258+ if ($ verifier ->isSignedRequest ()) {
259+ if (!$ verifier ->signedRequestIsValid ()) {
260+ return [false , 'Invalid url signature ' ];
261+ }
262+ // TODO: setup session ???
263+ $ urlCredential = $ verifier ->getUrlCredential ();
264+ $ user = \OC ::$ server ->getUserManager ()->get ($ urlCredential );
265+ if ($ user === null ) {
266+ $ message = \OC ::$ server ->getL10N ('dav ' )->t ('User unknown ' );
267+ throw new LoginException ($ message );
268+ }
269+ if (!$ user ->isEnabled ()) {
270+ $ message = \OC ::$ server ->getL10N ('dav ' )->t ('User disabled ' );
271+ throw new LoginException ($ message );
272+ }
273+ $ this ->userSession ->setUser ($ user );
274+ \OC_Util::setupFS ($ urlCredential );
275+ $ this ->session ->close ();
276+ return [true , $ this ->principalPrefix . $ urlCredential ];
277+ }
249278 return $ data ;
250279 }
251280
252281 /**
253282 * @param $user
254283 * @throws ServiceUnavailable
255284 */
256- private function checkAccountModule ($ user ) {
285+ private function checkAccountModule ($ user ): void {
257286 if ($ user === null ) {
258287 throw new \UnexpectedValueException ('No user in session ' );
259288 }
@@ -264,7 +293,7 @@ private function checkAccountModule($user) {
264293 }
265294 }
266295
267- public function challenge (RequestInterface $ request , ResponseInterface $ response ) {
296+ public function challenge (RequestInterface $ request , ResponseInterface $ response ): void {
268297 $ schema = 'Basic ' ;
269298 // do not re-authenticate over ajax, use dummy auth name to prevent browser popup
270299 if (\in_array ('XMLHttpRequest ' , \explode (', ' , $ request ->getHeader ('X-Requested-With ' )), true )) {
0 commit comments