[ Index ]

PHP Cross Reference of DokuWiki

title

Body

[close]

/_test/tests/inc/ -> JWTTest.php (source)

   1  <?php
   2  
   3  namespace dokuwiki\test;
   4  
   5  use dokuwiki\JWT;
   6  use dokuwiki\Logger;
   7  
   8  class JWTTest extends \DokuWikiTest
   9  {
  10  
  11  
  12      public function testCreation()
  13      {
  14          // no token file yet
  15          $file = JWT::getStorageFile('test');
  16          $this->assertFileDoesNotExist($file);
  17  
  18          // initialize a new token
  19          $jwt = JWT::fromUser('test');
  20          $this->assertFileExists($file);
  21          $this->assertEquals('test', $jwt->getUser());
  22          $token = $jwt->getToken();
  23          $issued = $jwt->getIssued();
  24  
  25          // validate the token
  26          $jwt = JWT::validate($token);
  27          $this->assertEquals('test', $jwt->getUser());
  28          $this->assertEquals($issued, $jwt->getIssued());
  29  
  30  
  31          // next access should get the same token
  32          $jwt = JWT::fromUser('test');
  33          $this->assertEquals($token, $jwt->getToken());
  34          $this->assertEquals($issued, $jwt->getIssued());
  35  
  36          // saving should create a new token
  37          sleep(1); // make sure we have a new timestamp
  38          $jwt->save();
  39          $this->assertNotEquals($token, $jwt->getToken());
  40          $this->assertNotEquals($issued, $jwt->getIssued());
  41      }
  42  
  43      public function testValidationFail()
  44      {
  45          $this->expectException(\Exception::class);
  46          $this->expectExceptionMessage('Invalid JWT signature');
  47          JWT::validate('invalid');
  48      }
  49  
  50      public function testLoadFail()
  51      {
  52          $jwt = JWT::fromUser('test');
  53          $token = $jwt->getToken();
  54          $file = JWT::getStorageFile('test');
  55          unlink($file);
  56  
  57          $this->expectException(\Exception::class);
  58          $this->expectExceptionMessage('JWT not found, maybe it expired?');
  59          JWT::validate($token);
  60      }
  61  
  62      public function testLoadExpireFail()
  63      {
  64          $jwt = JWT::fromUser('test');
  65          $token = $jwt->getToken();
  66          sleep(1); // make sure we have a new timestamp
  67          $jwt->save();
  68  
  69          $this->expectException(\Exception::class);
  70          $this->expectExceptionMessage('JWT invalid, maybe it expired?');
  71          JWT::validate($token);
  72      }
  73  
  74      public function testLogin()
  75      {
  76          $_SERVER['HTTP_AUTHORIZATION'] =  'Bearer ' . JWT::fromUser('testuser')->getToken();
  77  
  78          $this->assertArrayNotHasKey('REMOTE_USER', $_SERVER);
  79          auth_tokenlogin();
  80          $this->assertEquals('testuser', $_SERVER['REMOTE_USER']);
  81          unset($_SERVER['HTTP_AUTHORIZATION']);
  82      }
  83  
  84      public function testLoginAlternativeHeader()
  85      {
  86          // web servers pass dashes in header names as underscores
  87          $_SERVER['HTTP_X_DOKUWIKI_TOKEN'] = JWT::fromUser('testuser')->getToken();
  88  
  89          $this->assertArrayNotHasKey('REMOTE_USER', $_SERVER);
  90          auth_tokenlogin();
  91          $this->assertEquals('testuser', $_SERVER['REMOTE_USER']);
  92          unset($_SERVER['HTTP_X_DOKUWIKI_TOKEN']);
  93      }
  94  
  95      public function testLoginFailureIsLogged()
  96      {
  97          $logger = Logger::getInstance(Logger::LOG_DEBUG);
  98          $logging = self::getInaccessibleProperty($logger, 'isLogging');
  99          self::setInaccessibleProperty($logger, 'isLogging', true);
 100          $this->expectLogMessage('Token login failed: Invalid JWT signature', Logger::LOG_DEBUG);
 101  
 102          $_SERVER['HTTP_AUTHORIZATION'] = 'Bearer not-a-token';
 103          try {
 104              $this->assertFalse(auth_tokenlogin());
 105              $this->assertStringContainsString(
 106                  'Token login failed: Invalid JWT signature',
 107                  file_get_contents($logger->getLogfile())
 108              );
 109          } finally {
 110              self::setInaccessibleProperty($logger, 'isLogging', $logging);
 111              unset($_SERVER['HTTP_AUTHORIZATION']);
 112          }
 113      }
 114  }