sessions_controller.rb 5.6 KB

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