sessions_controller.rb 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239
  1. # Copyright (C) 2012-2016 Zammad Foundation, http://zammad-foundation.org/
  2. class SessionsController < ApplicationController
  3. prepend_before_action :authentication_check, only: %i[switch_to_user list delete]
  4. skip_before_action :verify_csrf_token, only: %i[show destroy create_omniauth failure_omniauth]
  5. skip_before_action :user_device_check, only: %i[create_sso]
  6. # "Create" a login, aka "log the user in"
  7. def create
  8. user = authenticate_with_password
  9. initiate_session_for(user)
  10. # return new session data
  11. render status: :created,
  12. json: SessionHelper.json_hash(user).merge(config: config_frontend)
  13. end
  14. def create_sso
  15. authenticate_with_sso
  16. redirect_to '/#'
  17. end
  18. def show
  19. user = authentication_check_only
  20. raise Exceptions::NotAuthorized, 'no valid session' if user.blank?
  21. initiate_session_for(user)
  22. # return current session
  23. render json: SessionHelper.json_hash(user).merge(config: config_frontend)
  24. rescue Exceptions::NotAuthorized => e
  25. render json: {
  26. error: e.message,
  27. config: config_frontend,
  28. models: SessionHelper.models,
  29. collections: { Locale.to_app_model => Locale.where(active: true) }
  30. }
  31. end
  32. # "Delete" a login, aka "log the user out"
  33. def destroy
  34. reset_session
  35. # Remove the user id from the session
  36. @_current_user = nil
  37. # reset session
  38. request.env['rack.session.options'][:expire_after] = nil
  39. render json: {}
  40. end
  41. def create_omniauth
  42. # in case, remove switched_from_user_id
  43. session[:switched_from_user_id] = nil
  44. auth = request.env['omniauth.auth']
  45. if !auth
  46. logger.info('AUTH IS NULL, SERVICE NOT LINKED TO ACCOUNT')
  47. # redirect to app
  48. redirect_to '/'
  49. end
  50. # Create a new user or add an auth to existing user, depending on
  51. # whether there is already a user signed in.
  52. authorization = Authorization.find_from_hash(auth)
  53. if !authorization
  54. authorization = Authorization.create_from_hash(auth, current_user)
  55. end
  56. if in_maintenance_mode?(authorization.user)
  57. redirect_to '/#'
  58. return
  59. end
  60. # set current session user
  61. current_user_set(authorization.user)
  62. # log new session
  63. authorization.user.activity_stream_log('session started', authorization.user.id, true)
  64. # remember last login date
  65. authorization.user.update_last_login
  66. # redirect to app
  67. redirect_to '/'
  68. end
  69. def failure_omniauth
  70. raise Exceptions::UnprocessableEntity, "Message from #{params[:strategy]}: #{params[:message]}"
  71. end
  72. # "switch" to user
  73. def switch_to_user
  74. permission_check(['admin.session', 'admin.user'])
  75. # check user
  76. if !params[:id]
  77. render(
  78. json: { message: 'no user given' },
  79. status: :not_found
  80. )
  81. return false
  82. end
  83. user = User.find(params[:id])
  84. if !user
  85. render(
  86. json: {},
  87. status: :not_found
  88. )
  89. return false
  90. end
  91. # remember old user
  92. session[:switched_from_user_id] = current_user.id
  93. # log new session
  94. user.activity_stream_log('switch to', current_user.id, true)
  95. # set session user
  96. current_user_set(user)
  97. render(
  98. json: {
  99. success: true,
  100. location: '',
  101. },
  102. )
  103. end
  104. # "switch" back to user
  105. def switch_back_to_user
  106. # check if it's a switch back
  107. raise Exceptions::NotAuthorized if !session[:switched_from_user_id]
  108. user = User.lookup(id: session[:switched_from_user_id])
  109. if !user
  110. render(
  111. json: {},
  112. status: :not_found
  113. )
  114. return false
  115. end
  116. # remember current user
  117. current_session_user = current_user
  118. # remove switched_from_user_id
  119. session[:switched_from_user_id] = nil
  120. # set old session user again
  121. current_user_set(user)
  122. # log end session
  123. current_session_user.activity_stream_log('ended switch to', user.id, true)
  124. render(
  125. json: {
  126. success: true,
  127. location: '',
  128. },
  129. )
  130. end
  131. def available
  132. render json: {
  133. app_version: AppVersion.get
  134. }
  135. end
  136. def list
  137. permission_check('admin.session')
  138. assets = {}
  139. sessions_clean = []
  140. SessionHelper.list.each do |session|
  141. next if session.data['user_id'].blank?
  142. sessions_clean.push session
  143. next if session.data['user_id']
  144. user = User.lookup(id: session.data['user_id'])
  145. next if !user
  146. assets = user.assets(assets)
  147. end
  148. render json: {
  149. sessions: sessions_clean,
  150. assets: assets,
  151. }
  152. end
  153. def delete
  154. permission_check('admin.session')
  155. SessionHelper.destroy(params[:id])
  156. render json: {}
  157. end
  158. private
  159. def initiate_session_for(user)
  160. request.env['rack.session.options'][:expire_after] = 1.year if params[:remember_me]
  161. session[:persistent] = true
  162. user.activity_stream_log('session started', user.id, true)
  163. end
  164. def config_frontend
  165. # config
  166. config = {}
  167. Setting.select('name, preferences').where(frontend: true).each do |setting|
  168. next if setting.preferences[:authentication] == true && !current_user
  169. value = Setting.get(setting.name)
  170. next if !current_user && (value == false || value.nil?)
  171. config[setting.name] = value
  172. end
  173. # remember if we can switch back to user
  174. if session[:switched_from_user_id]
  175. config['switch_back_to_possible'] = true
  176. end
  177. # remember session_id for websocket logon
  178. if current_user
  179. config['session_id'] = session.id
  180. end
  181. config
  182. end
  183. end