UserSource.js 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. /*
  2. Copyright (C) 2017 Cloudbase Solutions SRL
  3. This program is free software: you can redistribute it and/or modify
  4. it under the terms of the GNU Affero General Public License as
  5. published by the Free Software Foundation, either version 3 of the
  6. License, or (at your option) any later version.
  7. This program is distributed in the hope that it will be useful,
  8. but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  10. GNU Affero General Public License for more details.
  11. You should have received a copy of the GNU Affero General Public License
  12. along with this program. If not, see <http://www.gnu.org/licenses/>.
  13. */
  14. // @flow
  15. import cookie from 'js-cookie'
  16. import Api from '../utils/ApiCaller'
  17. import { servicesUrl } from '../config'
  18. import type { Credentials, User } from '../types/User'
  19. class UserModel {
  20. static parseUserData(response) {
  21. let data = {
  22. id: response.data.token.user.id,
  23. name: response.data.token.user.name,
  24. email: response.data.token.user.email,
  25. project: response.data.token.project,
  26. }
  27. return data
  28. }
  29. }
  30. class UserSource {
  31. static login(userData: Credentials): Promise<User> {
  32. let auth = {
  33. auth: {
  34. identity: {
  35. methods: ['password'],
  36. password: {
  37. user: {
  38. name: userData.name,
  39. domain: { name: 'default' },
  40. password: userData.password,
  41. },
  42. },
  43. },
  44. scope: 'unscoped',
  45. },
  46. }
  47. Api.setDefaultHeader('X-Auth-Token', null)
  48. return new Promise((resolve, reject) => {
  49. Api.sendAjaxRequest({
  50. url: servicesUrl.identity,
  51. method: 'POST',
  52. data: auth,
  53. }).then((response) => {
  54. let token = response.headers['X-Subject-Token'] || response.headers['x-subject-token']
  55. Api.setDefaultHeader('X-Auth-Token', token)
  56. cookie.set('unscopedToken', token, { expires: 30 })
  57. resolve(response)
  58. }, reject).catch(reject)
  59. })
  60. }
  61. static loginScoped(projectId: string, skipCookie?: boolean): Promise<User> {
  62. let useProjectId = skipCookie ? projectId : cookie.get('projectId') || projectId
  63. let token = cookie.get('unscopedToken')
  64. let auth = {
  65. auth: {
  66. identity: {
  67. methods: ['token'],
  68. token: {
  69. id: token,
  70. },
  71. },
  72. scope: {
  73. project: {
  74. id: useProjectId,
  75. },
  76. },
  77. },
  78. }
  79. Api.setDefaultHeader({ 'X-Auth-Token': null })
  80. return new Promise((resolve, reject) => {
  81. Api.sendAjaxRequest({
  82. url: servicesUrl.identity,
  83. method: 'POST',
  84. data: auth,
  85. }).then((response) => {
  86. let token = response.headers['X-Subject-Token'] || response.headers['x-subject-token']
  87. let data = UserModel.parseUserData(response)
  88. data = { ...data, token }
  89. cookie.set('token', data.token, { expires: 30 })
  90. cookie.set('projectId', data.project.id, { expires: 30 })
  91. Api.setDefaultHeader('X-Auth-Token', data.token)
  92. resolve(data)
  93. }, response => {
  94. if (!skipCookie) {
  95. UserSource.loginScoped(projectId, true).then(resolve, reject)
  96. } else {
  97. reject(response)
  98. }
  99. }).catch(reject)
  100. })
  101. }
  102. static tokenLogin(): Promise<User> {
  103. let token = cookie.get('token')
  104. let projectId = cookie.get('projectId')
  105. if (token) {
  106. Api.setDefaultHeader('X-Auth-Token', token)
  107. }
  108. return new Promise((resolve, reject) => {
  109. if (!token || !projectId) {
  110. reject()
  111. return
  112. }
  113. Api.sendAjaxRequest({
  114. url: servicesUrl.identity,
  115. method: 'GET',
  116. headers: { 'X-Subject-Token': token },
  117. }).then(response => {
  118. let data = UserModel.parseUserData(response)
  119. data = { ...data, token }
  120. resolve(data)
  121. }, () => {
  122. cookie.remove('token')
  123. cookie.remove('projectId')
  124. Api.resetHeaders()
  125. reject()
  126. }).catch(() => {
  127. cookie.remove('token')
  128. cookie.remove('projectId')
  129. Api.resetHeaders()
  130. reject()
  131. })
  132. })
  133. }
  134. static switchProject(): Promise<void> {
  135. let token = cookie.get('unscopedToken')
  136. return new Promise((resolve, reject) => {
  137. if (token) {
  138. cookie.remove('projectId')
  139. resolve()
  140. } else {
  141. reject()
  142. }
  143. })
  144. }
  145. static logout(): Promise<void> {
  146. let token = cookie.get('token')
  147. return new Promise((resolve, reject) => {
  148. Api.sendAjaxRequest({
  149. url: servicesUrl.identity,
  150. method: 'DELETE',
  151. headers: { 'X-Subject-Token': token },
  152. }).then(() => {
  153. cookie.remove('token')
  154. window.location.href = '/'
  155. resolve()
  156. }, reject).catch(() => {
  157. cookie.remove('token')
  158. window.location.href = '/'
  159. reject()
  160. })
  161. Api.resetHeaders()
  162. })
  163. }
  164. static getUserInfo(user: User): Promise<User> {
  165. return new Promise((resolve, reject) => {
  166. Api.sendAjaxRequest({
  167. url: `${servicesUrl.users}/${user.id}`,
  168. method: 'GET',
  169. }).then((response) => {
  170. resolve(response.data.user)
  171. }, reject).catch(reject)
  172. })
  173. }
  174. }
  175. export default UserSource