MediaWiki  1.34.0
ImmutableSessionProviderWithCookie.php
Go to the documentation of this file.
1 <?php
24 namespace MediaWiki\Session;
25 
26 use WebRequest;
27 
41 
43  protected $sessionCookieName = null;
45  protected $sessionCookieOptions = [];
46 
53  public function __construct( $params = [] ) {
54  parent::__construct();
55 
56  if ( isset( $params['sessionCookieName'] ) ) {
57  if ( !is_string( $params['sessionCookieName'] ) ) {
58  throw new \InvalidArgumentException( 'sessionCookieName must be a string' );
59  }
60  $this->sessionCookieName = $params['sessionCookieName'];
61  }
62  if ( isset( $params['sessionCookieOptions'] ) ) {
63  if ( !is_array( $params['sessionCookieOptions'] ) ) {
64  throw new \InvalidArgumentException( 'sessionCookieOptions must be an array' );
65  }
66  $this->sessionCookieOptions = $params['sessionCookieOptions'];
67  }
68  }
69 
81  protected function getSessionIdFromCookie( WebRequest $request ) {
82  if ( $this->sessionCookieName === null ) {
83  throw new \BadMethodCallException(
84  __METHOD__ . ' may not be called when $this->sessionCookieName === null'
85  );
86  }
87 
88  $prefix = $this->sessionCookieOptions['prefix'] ?? $this->config->get( 'CookiePrefix' );
89  $id = $request->getCookie( $this->sessionCookieName, $prefix );
90  return SessionManager::validateSessionId( $id ) ? $id : null;
91  }
92 
93  public function persistsSessionId() {
94  return $this->sessionCookieName !== null;
95  }
96 
97  public function canChangeUser() {
98  return false;
99  }
100 
101  public function persistSession( SessionBackend $session, WebRequest $request ) {
102  if ( $this->sessionCookieName === null ) {
103  return;
104  }
105 
106  $response = $request->response();
107  if ( $response->headersSent() ) {
108  // Can't do anything now
109  $this->logger->debug( __METHOD__ . ': Headers already sent' );
110  return;
111  }
112 
113  $options = $this->sessionCookieOptions;
114  if ( $session->shouldForceHTTPS() || $session->getUser()->requiresHTTPS() ) {
115  $response->setCookie( 'forceHTTPS', 'true', null,
116  [ 'prefix' => '', 'secure' => false ] + $options );
117  $options['secure'] = true;
118  }
119 
120  $response->setCookie( $this->sessionCookieName, $session->getId(), null, $options );
121  }
122 
123  public function unpersistSession( WebRequest $request ) {
124  if ( $this->sessionCookieName === null ) {
125  return;
126  }
127 
128  $response = $request->response();
129  if ( $response->headersSent() ) {
130  // Can't do anything now
131  $this->logger->debug( __METHOD__ . ': Headers already sent' );
132  return;
133  }
134 
135  $response->clearCookie( $this->sessionCookieName, $this->sessionCookieOptions );
136  }
137 
138  public function getVaryCookies() {
139  if ( $this->sessionCookieName === null ) {
140  return [];
141  }
142 
143  $prefix = $this->sessionCookieOptions['prefix'] ?? $this->config->get( 'CookiePrefix' );
144  return [ $prefix . $this->sessionCookieName ];
145  }
146 
147  public function whyNoSession() {
148  return wfMessage( 'sessionprovider-nocookies' );
149  }
150 }
MediaWiki\Session\ImmutableSessionProviderWithCookie\$sessionCookieName
string null $sessionCookieName
Definition: ImmutableSessionProviderWithCookie.php:43
MediaWiki\Session\ImmutableSessionProviderWithCookie\getSessionIdFromCookie
getSessionIdFromCookie(WebRequest $request)
Get the session ID from the cookie, if any.
Definition: ImmutableSessionProviderWithCookie.php:81
MediaWiki\Session\SessionBackend\getUser
getUser()
Returns the authenticated user for this session.
Definition: SessionBackend.php:391
$response
$response
Definition: opensearch_desc.php:38
MediaWiki\Session\SessionBackend\getId
getId()
Returns the session ID.
Definition: SessionBackend.php:225
wfMessage
wfMessage( $key,... $params)
This is the function for getting translated interface messages.
Definition: GlobalFunctions.php:1264
MediaWiki\Session\ImmutableSessionProviderWithCookie\unpersistSession
unpersistSession(WebRequest $request)
Remove any persisted session from a request/response.
Definition: ImmutableSessionProviderWithCookie.php:123
MediaWiki\Session\ImmutableSessionProviderWithCookie
An ImmutableSessionProviderWithCookie doesn't persist the user, but optionally can use a cookie to su...
Definition: ImmutableSessionProviderWithCookie.php:40
MediaWiki\Session\SessionManager\validateSessionId
static validateSessionId( $id)
Validate a session ID.
Definition: SessionManager.php:365
MediaWiki\Session\ImmutableSessionProviderWithCookie\canChangeUser
canChangeUser()
Indicate whether the user associated with the request can be changed.
Definition: ImmutableSessionProviderWithCookie.php:97
MediaWiki\Session\SessionProvider
A SessionProvider provides SessionInfo and support for Session.
Definition: SessionProvider.php:78
MediaWiki\Session\ImmutableSessionProviderWithCookie\$sessionCookieOptions
mixed[] $sessionCookieOptions
Definition: ImmutableSessionProviderWithCookie.php:45
MediaWiki\Session
Definition: BotPasswordSessionProvider.php:24
WebRequest\response
response()
Return a handle to WebResponse style object, for setting cookies, headers and other stuff,...
Definition: WebRequest.php:1036
MediaWiki\Session\SessionBackend\shouldForceHTTPS
shouldForceHTTPS()
Whether HTTPS should be forced.
Definition: SessionBackend.php:451
WebRequest\getCookie
getCookie( $key, $prefix=null, $default=null)
Get a cookie from the $_COOKIE jar.
Definition: WebRequest.php:839
WebRequest
The WebRequest class encapsulates getting at data passed in the URL or via a POSTed form stripping il...
Definition: WebRequest.php:42
MediaWiki\Session\ImmutableSessionProviderWithCookie\persistSession
persistSession(SessionBackend $session, WebRequest $request)
Persist a session into a request/response.
Definition: ImmutableSessionProviderWithCookie.php:101
MediaWiki\Session\ImmutableSessionProviderWithCookie\persistsSessionId
persistsSessionId()
Indicate whether self::persistSession() can save arbitrary session IDs.
Definition: ImmutableSessionProviderWithCookie.php:93
MediaWiki\Session\ImmutableSessionProviderWithCookie\whyNoSession
whyNoSession()
Return a Message for why sessions might not be being persisted.
Definition: ImmutableSessionProviderWithCookie.php:147
MediaWiki\Session\ImmutableSessionProviderWithCookie\getVaryCookies
getVaryCookies()
Return the list of cookies that need varying on.
Definition: ImmutableSessionProviderWithCookie.php:138
MediaWiki\Session\ImmutableSessionProviderWithCookie\__construct
__construct( $params=[])
Definition: ImmutableSessionProviderWithCookie.php:53
MediaWiki\Session\SessionBackend
This is the actual workhorse for Session.
Definition: SessionBackend.php:50