auth-user.model.ts 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. import { peertubeLocalStorage } from '@app/shared/misc/peertube-local-storage'
  2. import { UserRight } from '../../../../../shared/models/users/user-right.enum'
  3. import { User as ServerUserModel } from '../../../../../shared/models/users/user.model'
  4. // Do not use the barrel (dependency loop)
  5. import { hasUserRight, UserRole } from '../../../../../shared/models/users/user-role'
  6. import { User } from '../../shared/users/user.model'
  7. import { NSFWPolicyType } from '../../../../../shared/models/videos/nsfw-policy.type'
  8. export type TokenOptions = {
  9. accessToken: string
  10. refreshToken: string
  11. tokenType: string
  12. }
  13. // Private class only used by User
  14. class Tokens {
  15. private static KEYS = {
  16. ACCESS_TOKEN: 'access_token',
  17. REFRESH_TOKEN: 'refresh_token',
  18. TOKEN_TYPE: 'token_type'
  19. }
  20. accessToken: string
  21. refreshToken: string
  22. tokenType: string
  23. static load () {
  24. const accessTokenLocalStorage = peertubeLocalStorage.getItem(this.KEYS.ACCESS_TOKEN)
  25. const refreshTokenLocalStorage = peertubeLocalStorage.getItem(this.KEYS.REFRESH_TOKEN)
  26. const tokenTypeLocalStorage = peertubeLocalStorage.getItem(this.KEYS.TOKEN_TYPE)
  27. if (accessTokenLocalStorage && refreshTokenLocalStorage && tokenTypeLocalStorage) {
  28. return new Tokens({
  29. accessToken: accessTokenLocalStorage,
  30. refreshToken: refreshTokenLocalStorage,
  31. tokenType: tokenTypeLocalStorage
  32. })
  33. }
  34. return null
  35. }
  36. static flush () {
  37. peertubeLocalStorage.removeItem(this.KEYS.ACCESS_TOKEN)
  38. peertubeLocalStorage.removeItem(this.KEYS.REFRESH_TOKEN)
  39. peertubeLocalStorage.removeItem(this.KEYS.TOKEN_TYPE)
  40. }
  41. constructor (hash?: TokenOptions) {
  42. if (hash) {
  43. this.accessToken = hash.accessToken
  44. this.refreshToken = hash.refreshToken
  45. if (hash.tokenType === 'bearer') {
  46. this.tokenType = 'Bearer'
  47. } else {
  48. this.tokenType = hash.tokenType
  49. }
  50. }
  51. }
  52. save () {
  53. peertubeLocalStorage.setItem(Tokens.KEYS.ACCESS_TOKEN, this.accessToken)
  54. peertubeLocalStorage.setItem(Tokens.KEYS.REFRESH_TOKEN, this.refreshToken)
  55. peertubeLocalStorage.setItem(Tokens.KEYS.TOKEN_TYPE, this.tokenType)
  56. }
  57. }
  58. export class AuthUser extends User {
  59. private static KEYS = {
  60. ID: 'id',
  61. ROLE: 'role',
  62. EMAIL: 'email',
  63. VIDEOS_HISTORY_ENABLED: 'videos-history-enabled',
  64. USERNAME: 'username',
  65. NSFW_POLICY: 'nsfw_policy',
  66. WEBTORRENT_ENABLED: 'peertube-videojs-' + 'webtorrent_enabled',
  67. AUTO_PLAY_VIDEO: 'auto_play_video'
  68. }
  69. tokens: Tokens
  70. static load () {
  71. const usernameLocalStorage = peertubeLocalStorage.getItem(this.KEYS.USERNAME)
  72. if (usernameLocalStorage) {
  73. return new AuthUser(
  74. {
  75. id: parseInt(peertubeLocalStorage.getItem(this.KEYS.ID), 10),
  76. username: peertubeLocalStorage.getItem(this.KEYS.USERNAME),
  77. email: peertubeLocalStorage.getItem(this.KEYS.EMAIL),
  78. role: parseInt(peertubeLocalStorage.getItem(this.KEYS.ROLE), 10) as UserRole,
  79. nsfwPolicy: peertubeLocalStorage.getItem(this.KEYS.NSFW_POLICY) as NSFWPolicyType,
  80. webTorrentEnabled: peertubeLocalStorage.getItem(this.KEYS.WEBTORRENT_ENABLED) === 'true',
  81. autoPlayVideo: peertubeLocalStorage.getItem(this.KEYS.AUTO_PLAY_VIDEO) === 'true',
  82. videosHistoryEnabled: peertubeLocalStorage.getItem(this.KEYS.VIDEOS_HISTORY_ENABLED) === 'true'
  83. },
  84. Tokens.load()
  85. )
  86. }
  87. return null
  88. }
  89. static flush () {
  90. peertubeLocalStorage.removeItem(this.KEYS.USERNAME)
  91. peertubeLocalStorage.removeItem(this.KEYS.ID)
  92. peertubeLocalStorage.removeItem(this.KEYS.ROLE)
  93. peertubeLocalStorage.removeItem(this.KEYS.NSFW_POLICY)
  94. peertubeLocalStorage.removeItem(this.KEYS.WEBTORRENT_ENABLED)
  95. peertubeLocalStorage.removeItem(this.KEYS.VIDEOS_HISTORY_ENABLED)
  96. peertubeLocalStorage.removeItem(this.KEYS.AUTO_PLAY_VIDEO)
  97. peertubeLocalStorage.removeItem(this.KEYS.EMAIL)
  98. Tokens.flush()
  99. }
  100. constructor (userHash: Partial<ServerUserModel>, hashTokens: TokenOptions) {
  101. super(userHash)
  102. this.tokens = new Tokens(hashTokens)
  103. }
  104. getAccessToken () {
  105. return this.tokens.accessToken
  106. }
  107. getRefreshToken () {
  108. return this.tokens.refreshToken
  109. }
  110. getTokenType () {
  111. return this.tokens.tokenType
  112. }
  113. refreshTokens (accessToken: string, refreshToken: string) {
  114. this.tokens.accessToken = accessToken
  115. this.tokens.refreshToken = refreshToken
  116. }
  117. hasRight (right: UserRight) {
  118. return hasUserRight(this.role, right)
  119. }
  120. canManage (user: ServerUserModel) {
  121. const myRole = this.role
  122. if (myRole === UserRole.ADMINISTRATOR) return true
  123. // I'm a moderator: I can only manage users
  124. return user.role === UserRole.USER
  125. }
  126. save () {
  127. peertubeLocalStorage.setItem(AuthUser.KEYS.ID, this.id.toString())
  128. peertubeLocalStorage.setItem(AuthUser.KEYS.USERNAME, this.username)
  129. peertubeLocalStorage.setItem(AuthUser.KEYS.EMAIL, this.email)
  130. peertubeLocalStorage.setItem(AuthUser.KEYS.ROLE, this.role.toString())
  131. peertubeLocalStorage.setItem(AuthUser.KEYS.NSFW_POLICY, this.nsfwPolicy.toString())
  132. peertubeLocalStorage.setItem(AuthUser.KEYS.WEBTORRENT_ENABLED, JSON.stringify(this.webTorrentEnabled))
  133. peertubeLocalStorage.setItem(AuthUser.KEYS.AUTO_PLAY_VIDEO, JSON.stringify(this.autoPlayVideo))
  134. this.tokens.save()
  135. }
  136. }