Skip to content
Snippets Groups Projects
Select Git revision
  • 41b3733ff6b1dd9213c1fd610b1e2606f1294933
  • main default protected
  • studip-rector
  • ci-opt
  • course-members-export-as-word
  • data-vue-app
  • pipeline-improvements
  • webpack-optimizations
  • rector
  • icon-renewal
  • http-client-and-factories
  • jsonapi-atomic-operations
  • vueify-messages
  • tic-2341
  • 135-translatable-study-areas
  • extensible-sorm-action-parameters
  • sorm-configuration-trait
  • jsonapi-mvv-routes
  • docblocks-for-magic-methods
19 results

SchemaMap.php

Blame
  • Forked from Stud.IP / Stud.IP
    Source project has a limited visibility.
    Code owners
    Assign users and groups as approvers for specific file changes. Learn more.
    Authentication.php 2.91 KiB
    <?php
    
    namespace JsonApi\Middlewares;
    
    use Psr\Http\Message\ResponseInterface;
    use Psr\Http\Message\ServerRequestInterface as Request;
    use Psr\Http\Server\RequestHandlerInterface as RequestHandler;
    use Slim\Psr7\Response;
    
    class Authentication
    {
        // der Schlüssel des Request-Attributs, in dem der Stud.IP-Nutzer
        // gefunden werden kann:
    
        // $user = $request->getAttribute(Authentication::USER_KEY);
        const USER_KEY = 'studip-user';
    
        // a callable accepting two arguments username and password and
        // returning either null or a Stud.IP user object
        /** @var callable */
        private $authenticator;
    
        /**
         * Der Konstruktor.
         *
         * @param callable $authenticator ein Callable, das den Nutzernamen und
         *                                das Passwort als Argumente erhält und
         *                                damit entweder einen Stud.IP-User-Objekt
         *                                oder null zurückgibt
         */
        public function __construct($authenticator)
        {
            $this->authenticator = $authenticator;
        }
    
        /**
         * Hier muss die Autorisierung implementiert werden.
         *
         * @param Request        $request das Request-Objekt
         * @param RequestHandler $handler der PSR-15 Request Handler
         *
         * @return ResponseInterface das neue Response-Objekt
         *
         * @SuppressWarnings(PHPMD.Superglobals)
         */
        public function __invoke(Request $request, RequestHandler $handler)
        {
            $guards = [
                new Auth\SessionStrategy(),
                new Auth\HttpBasicAuthStrategy($request, $this->authenticator),
                new Auth\OAuth1Strategy($request, $this->authenticator),
            ];
    
            foreach ($guards as $guard) {
                if ($guard->check()) {
                    $request = $this->provideUser($request, $guard->user());
    
                    return $handler->handle($request);
                }
            }
    
            return $this->generateChallenges($guards);
        }
    
        // according to RFC 2616
        private function generateChallenges(array $guards): Response
        {
            $response = new Response(401);
    
            foreach ($guards as $guard) {
                $response = $guard->addChallenge($response);
            }
    
            return $response;
        }
    
        /**
         * @SuppressWarnings(PHPMD.Superglobals)
         */
        private function provideUser(Request $request, \User $user): Request
        {
            if ('nobody' === $GLOBALS['user']->id) {
                $GLOBALS['user'] = new \Seminar_User($user);
                $GLOBALS['auth'] = new \Seminar_Auth();
                $GLOBALS['auth']->auth = [
                    'uid' => $user->id,
                    'uname' => $user->username,
                    'perm' => $user->perms,
                ];
                $GLOBALS['perm'] = new \Seminar_Perm();
                $GLOBALS['MAIL_VALIDATE_BOX'] = false;
                $GLOBALS['sess']->delete();
                setTempLanguage($user->id);
            }
    
            return $request->withAttribute(self::USER_KEY, $user);
        }
    }