class-wp-user-meta-session-tokens.php 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. <?php
  2. /**
  3. * Session API: WP_User_Meta_Session_Tokens class
  4. *
  5. * @package WordPress
  6. * @subpackage Session
  7. * @since 4.7.0
  8. */
  9. /**
  10. * Meta-based user sessions token manager.
  11. *
  12. * @since 4.0.0
  13. *
  14. * @see WP_Session_Tokens
  15. */
  16. class WP_User_Meta_Session_Tokens extends WP_Session_Tokens {
  17. /**
  18. * Retrieves all sessions of the user.
  19. *
  20. * @since 4.0.0
  21. *
  22. * @return array Sessions of the user.
  23. */
  24. protected function get_sessions() {
  25. $sessions = get_user_meta( $this->user_id, 'session_tokens', true );
  26. if ( ! is_array( $sessions ) ) {
  27. return array();
  28. }
  29. $sessions = array_map( array( $this, 'prepare_session' ), $sessions );
  30. return array_filter( $sessions, array( $this, 'is_still_valid' ) );
  31. }
  32. /**
  33. * Converts an expiration to an array of session information.
  34. *
  35. * @param mixed $session Session or expiration.
  36. * @return array Session.
  37. */
  38. protected function prepare_session( $session ) {
  39. if ( is_int( $session ) ) {
  40. return array( 'expiration' => $session );
  41. }
  42. return $session;
  43. }
  44. /**
  45. * Retrieves a session based on its verifier (token hash).
  46. *
  47. * @since 4.0.0
  48. *
  49. * @param string $verifier Verifier for the session to retrieve.
  50. * @return array|null The session, or null if it does not exist
  51. */
  52. protected function get_session( $verifier ) {
  53. $sessions = $this->get_sessions();
  54. if ( isset( $sessions[ $verifier ] ) ) {
  55. return $sessions[ $verifier ];
  56. }
  57. return null;
  58. }
  59. /**
  60. * Updates a session based on its verifier (token hash).
  61. *
  62. * @since 4.0.0
  63. *
  64. * @param string $verifier Verifier for the session to update.
  65. * @param array $session Optional. Session. Omitting this argument destroys the session.
  66. */
  67. protected function update_session( $verifier, $session = null ) {
  68. $sessions = $this->get_sessions();
  69. if ( $session ) {
  70. $sessions[ $verifier ] = $session;
  71. } else {
  72. unset( $sessions[ $verifier ] );
  73. }
  74. $this->update_sessions( $sessions );
  75. }
  76. /**
  77. * Updates the user's sessions in the usermeta table.
  78. *
  79. * @since 4.0.0
  80. *
  81. * @param array $sessions Sessions.
  82. */
  83. protected function update_sessions( $sessions ) {
  84. if ( $sessions ) {
  85. update_user_meta( $this->user_id, 'session_tokens', $sessions );
  86. } else {
  87. delete_user_meta( $this->user_id, 'session_tokens' );
  88. }
  89. }
  90. /**
  91. * Destroys all sessions for this user, except the single session with the given verifier.
  92. *
  93. * @since 4.0.0
  94. *
  95. * @param string $verifier Verifier of the session to keep.
  96. */
  97. protected function destroy_other_sessions( $verifier ) {
  98. $session = $this->get_session( $verifier );
  99. $this->update_sessions( array( $verifier => $session ) );
  100. }
  101. /**
  102. * Destroys all session tokens for the user.
  103. *
  104. * @since 4.0.0
  105. */
  106. protected function destroy_all_sessions() {
  107. $this->update_sessions( array() );
  108. }
  109. /**
  110. * Destroys all sessions for all users.
  111. *
  112. * @since 4.0.0
  113. */
  114. public static function drop_sessions() {
  115. delete_metadata( 'user', 0, 'session_tokens', false, true );
  116. }
  117. }