sessions_controller.rb 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285
  1. # Copyright (C) 2012-2014 Zammad Foundation, http://zammad-foundation.org/
  2. class SessionsController < ApplicationController
  3. # "Create" a login, aka "log the user in"
  4. def create
  5. # in case, remove switched_from_user_id
  6. session[:switched_from_user_id] = nil
  7. # authenticate user
  8. user = User.authenticate(params[:username], params[:password])
  9. # auth failed
  10. if !user
  11. render json: { error: 'login failed' }, status: :unauthorized
  12. return
  13. end
  14. # remember me - set session cookie to expire later
  15. request.env['rack.session.options'][:expire_after] = if params[:remember_me]
  16. 1.year
  17. end
  18. # both not needed to set :expire_after works fine
  19. # request.env['rack.session.options'][:renew] = true
  20. # reset_session
  21. # set session user
  22. current_user_set(user)
  23. # log device
  24. return if !user_device_log(user, 'session')
  25. # log new session
  26. user.activity_stream_log('session started', user.id, true)
  27. # add session user assets
  28. assets = {}
  29. assets = user.assets(assets)
  30. # auto population of default collections
  31. collections, assets = SessionHelper.default_collections(user, assets)
  32. # get models
  33. models = SessionHelper.models(user)
  34. # sessions created via this
  35. # controller are persistent
  36. session[:persistent] = true
  37. # return new session data
  38. render status: :created,
  39. json: {
  40. session: user,
  41. config: config_frontend,
  42. models: models,
  43. collections: collections,
  44. assets: assets,
  45. }
  46. end
  47. def show
  48. user_id = nil
  49. # no valid sessions
  50. if session[:user_id]
  51. user_id = session[:user_id]
  52. end
  53. if !user_id
  54. # get models
  55. models = SessionHelper.models()
  56. render json: {
  57. error: 'no valid session',
  58. config: config_frontend,
  59. models: models,
  60. collections: {
  61. Locale.to_app_model => Locale.where(active: true)
  62. },
  63. }
  64. return
  65. end
  66. # Save the user ID in the session so it can be used in
  67. # subsequent requests
  68. user = User.find(user_id)
  69. # log device
  70. return if !user_device_log(user, 'session')
  71. # add session user assets
  72. assets = {}
  73. assets = user.assets(assets)
  74. # auto population of default collections
  75. collections, assets = SessionHelper.default_collections(user, assets)
  76. # get models
  77. models = SessionHelper.models(user)
  78. # return current session
  79. render json: {
  80. session: user,
  81. config: config_frontend,
  82. models: models,
  83. collections: collections,
  84. assets: assets,
  85. }
  86. end
  87. # "Delete" a login, aka "log the user out"
  88. def destroy
  89. # Remove the user id from the session
  90. @_current_user = session[:user_id] = nil
  91. # reset session cookie (reset :expire_after in case remember_me is active)
  92. request.env['rack.session.options'][:expire_after] = -1.years
  93. request.env['rack.session.options'][:renew] = true
  94. render json: {}
  95. end
  96. def create_omniauth
  97. # in case, remove switched_from_user_id
  98. session[:switched_from_user_id] = nil
  99. auth = request.env['omniauth.auth']
  100. if !auth
  101. logger.info('AUTH IS NULL, SERVICE NOT LINKED TO ACCOUNT')
  102. # redirect to app
  103. redirect_to '/'
  104. end
  105. # Create a new user or add an auth to existing user, depending on
  106. # whether there is already a user signed in.
  107. authorization = Authorization.find_from_hash(auth)
  108. if !authorization
  109. authorization = Authorization.create_from_hash(auth, current_user)
  110. end
  111. # set current session user
  112. current_user_set(authorization.user)
  113. # log new session
  114. authorization.user.activity_stream_log('session started', authorization.user.id, true)
  115. # remember last login date
  116. authorization.user.update_last_login
  117. # redirect to app
  118. redirect_to '/'
  119. end
  120. def create_sso
  121. # in case, remove switched_from_user_id
  122. session[:switched_from_user_id] = nil
  123. user = User.sso(params)
  124. # Log the authorizing user in.
  125. if user
  126. # set current session user
  127. current_user_set(user)
  128. # log new session
  129. user.activity_stream_log('session started', user.id, true)
  130. # remember last login date
  131. user.update_last_login
  132. end
  133. # redirect to app
  134. redirect_to '/#'
  135. end
  136. # "switch" to user
  137. def switch_to_user
  138. return if deny_if_not_role(Z_ROLENAME_ADMIN)
  139. # check user
  140. if !params[:id]
  141. render(
  142. json: { message: 'no user given' },
  143. status: :not_found
  144. )
  145. return false
  146. end
  147. user = User.find(params[:id])
  148. if !user
  149. render(
  150. json: {},
  151. status: :not_found
  152. )
  153. return false
  154. end
  155. # remember old user
  156. session[:switched_from_user_id] = current_user.id
  157. # log new session
  158. user.activity_stream_log('switch to', current_user.id, true)
  159. # set session user
  160. current_user_set(user)
  161. render(
  162. json: {
  163. success: true,
  164. location: '',
  165. },
  166. )
  167. end
  168. # "switch" back to user
  169. def switch_back_to_user
  170. # check if it's a swich back
  171. if !session[:switched_from_user_id]
  172. response_access_deny
  173. return false
  174. end
  175. user = User.lookup(id: session[:switched_from_user_id])
  176. if !user
  177. render(
  178. json: {},
  179. status: :not_found
  180. )
  181. return false
  182. end
  183. # rememeber current user
  184. current_session_user = current_user
  185. # remove switched_from_user_id
  186. session[:switched_from_user_id] = nil
  187. # set old session user again
  188. current_user_set(user)
  189. # log end session
  190. current_session_user.activity_stream_log('ended switch to', user.id, true)
  191. render(
  192. json: {
  193. success: true,
  194. location: '',
  195. },
  196. )
  197. end
  198. def list
  199. return if deny_if_not_role(Z_ROLENAME_ADMIN)
  200. assets = {}
  201. sessions_clean = []
  202. SessionHelper.list.each {|session|
  203. next if !session.data['user_id']
  204. sessions_clean.push session
  205. if session.data['user_id']
  206. user = User.lookup(id: session.data['user_id'])
  207. assets = user.assets(assets)
  208. end
  209. }
  210. render json: {
  211. sessions: sessions_clean,
  212. assets: assets,
  213. }
  214. end
  215. def delete
  216. return if deny_if_not_role(Z_ROLENAME_ADMIN)
  217. SessionHelper.destroy(params[:id])
  218. render json: {}
  219. end
  220. end