sessions_controller.rb 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234
  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. # authenticate user
  6. user = User.authenticate( params[:username], params[:password] )
  7. # auth failed
  8. if !user
  9. render :json => { :error => 'login failed' }, :status => :unauthorized
  10. return
  11. end
  12. # remember me - set session cookie to expire later
  13. if params[:remember_me]
  14. request.env['rack.session.options'][:expire_after] = 1.year
  15. else
  16. request.env['rack.session.options'][:expire_after] = nil
  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 new session
  24. user.activity_stream_log( 'session started', user.id, true )
  25. # auto population of default collections
  26. collections, assets = SessionHelper::default_collections(user)
  27. # add session user assets
  28. assets = user.assets(assets)
  29. # get models
  30. models = SessionHelper::models(user)
  31. # check logon session
  32. logon_session_key = nil
  33. if params['logon_session']
  34. logon_session_key = Digest::MD5.hexdigest( rand(999999).to_s + Time.new.to_s )
  35. # session = ActiveRecord::SessionStore::Session.create(
  36. # :session_id => logon_session_key,
  37. # :data => {
  38. # :user_id => user['id']
  39. # }
  40. # )
  41. end
  42. # return new session data
  43. render :json => {
  44. :session => user,
  45. :models => models,
  46. :collections => collections,
  47. :assets => assets,
  48. :logon_session => logon_session_key,
  49. },
  50. :status => :created
  51. end
  52. def show
  53. user_id = nil
  54. # no valid sessions
  55. if session[:user_id]
  56. user_id = session[:user_id]
  57. end
  58. # check logon session
  59. if params['logon_session']
  60. session = SessionHelper::get( params['logon_session'] )
  61. if session
  62. user_id = session.data[:user_id]
  63. end
  64. end
  65. if !user_id
  66. # get models
  67. models = SessionHelper::models()
  68. render :json => {
  69. :error => 'no valid session',
  70. :config => config_frontend,
  71. :models => models,
  72. }
  73. return
  74. end
  75. # Save the user ID in the session so it can be used in
  76. # subsequent requests
  77. user = User.find( user_id )
  78. # auto population of default collections
  79. collections, assets = SessionHelper::default_collections(user)
  80. # add session user assets
  81. assets = user.assets(assets)
  82. # get models
  83. models = SessionHelper::models(user)
  84. # return current session
  85. render :json => {
  86. :session => user,
  87. :models => models,
  88. :collections => collections,
  89. :assets => assets,
  90. :config => config_frontend,
  91. }
  92. end
  93. # "Delete" a login, aka "log the user out"
  94. def destroy
  95. # Remove the user id from the session
  96. @_current_user = session[:user_id] = nil
  97. # reset session cookie (reset :expire_after in case remember_me is active)
  98. request.env['rack.session.options'][:expire_after] = -1.year
  99. request.env['rack.session.options'][:renew] = true
  100. render :json => { }
  101. end
  102. def create_omniauth
  103. auth = request.env['omniauth.auth']
  104. if !auth
  105. logger.info("AUTH IS NULL, SERVICE NOT LINKED TO ACCOUNT")
  106. # redirect to app
  107. redirect_to '/'
  108. end
  109. # Create a new user or add an auth to existing user, depending on
  110. # whether there is already a user signed in.
  111. authorization = Authorization.find_from_hash(auth)
  112. if !authorization
  113. authorization = Authorization.create_from_hash(auth, current_user)
  114. end
  115. # set current session user
  116. current_user_set(authorization.user)
  117. # log new session
  118. user.activity_stream_log( 'session started', authorization.user.id, true )
  119. # remember last login date
  120. authorization.user.update_last_login
  121. # redirect to app
  122. redirect_to '/'
  123. end
  124. def create_sso
  125. user = User.sso(params)
  126. # Log the authorizing user in.
  127. if user
  128. # set current session user
  129. current_user_set(user)
  130. # log new session
  131. user.activity_stream_log( 'session started', user.id, true )
  132. # remember last login date
  133. user.update_last_login
  134. end
  135. # redirect to app
  136. redirect_to '/#'
  137. end
  138. # "switch" to user
  139. def switch_to_user
  140. return if deny_if_not_role('Admin')
  141. # check user
  142. if !params[:id]
  143. render(
  144. :json => { :message => 'no user given' },
  145. :status => :not_found
  146. )
  147. return false
  148. end
  149. user = User.lookup( :id => params[:id] )
  150. if !user
  151. render(
  152. :json => {},
  153. :status => :not_found
  154. )
  155. return false
  156. end
  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. redirect_to '/#'
  162. end
  163. def list
  164. return if deny_if_not_role('Admin')
  165. assets = {}
  166. sessions_clean = []
  167. SessionHelper.list.each {|session|
  168. next if !session.data['user_id']
  169. sessions_clean.push session
  170. if session.data['user_id']
  171. user = User.lookup( :id => session.data['user_id'] )
  172. assets = user.assets( assets )
  173. end
  174. }
  175. render :json => {
  176. :sessions => sessions_clean,
  177. :assets => assets,
  178. }
  179. end
  180. def delete
  181. return if deny_if_not_role('Admin')
  182. SessionHelper::destroy( params[:id] )
  183. render :json => {}
  184. end
  185. end