sessions_controller.rb 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. # Copyright (C) 2012-2013 Zammad Foundation, http://zammad-foundation.org/
  2. class SessionsController < ApplicationController
  3. # def create
  4. # render :text => request.env['rack.auth'].inspect
  5. # end
  6. # "Create" a login, aka "log the user in"
  7. def create
  8. # authenticate user
  9. user = User.authenticate( params[:username], params[:password] )
  10. # auth failed
  11. if !user
  12. render :json => { :error => 'login failed' }, :status => :unauthorized
  13. return
  14. end
  15. # auto population of default collections
  16. default_collection = SessionHelper::default_collections(user)
  17. # remember me - set session cookie to expire later
  18. if params[:remember_me]
  19. request.env['rack.session.options'][:expire_after] = 1.year
  20. else
  21. request.env['rack.session.options'][:expire_after] = nil
  22. end
  23. # both not needed to set :expire_after works fine
  24. # request.env['rack.session.options'][:renew] = true
  25. # reset_session
  26. # set session user_id
  27. user = User.find_fulldata(user.id)
  28. # check logon session
  29. logon_session_key = nil
  30. if params['logon_session']
  31. logon_session_key = Digest::MD5.hexdigest( rand(999999).to_s + Time.new.to_s )
  32. # session = ActiveRecord::SessionStore::Session.create(
  33. # :session_id => logon_session_key,
  34. # :data => {
  35. # :user_id => user['id']
  36. # }
  37. # )
  38. else
  39. session[:user_id] = user['id']
  40. end
  41. # return new session data
  42. render :json => {
  43. :session => user,
  44. :default_collections => default_collection,
  45. :logon_session => logon_session_key,
  46. },
  47. :status => :created
  48. end
  49. def show
  50. user_id = nil
  51. # no valid sessions
  52. if session[:user_id]
  53. user_id = session[:user_id]
  54. end
  55. # check logon session
  56. if params['logon_session']
  57. session = ActiveRecord::SessionStore::Session.where( :session_id => params['logon_session'] ).first
  58. if session
  59. user_id = session.data[:user_id]
  60. end
  61. end
  62. if !user_id
  63. render :json => {
  64. :error => 'no valid session',
  65. :config => config_frontend,
  66. }
  67. return
  68. end
  69. # Save the user ID in the session so it can be used in
  70. # subsequent requests
  71. user = User.user_data_full( user_id )
  72. # auto population of default collections
  73. default_collection = SessionHelper::default_collections( User.find(user_id) )
  74. # return current session
  75. render :json => {
  76. :session => user,
  77. :default_collections => default_collection,
  78. :config => config_frontend,
  79. }
  80. end
  81. # "Delete" a login, aka "log the user out"
  82. def destroy
  83. # Remove the user id from the session
  84. @_current_user = session[:user_id] = nil
  85. # reset session cookie (reset :expire_after in case remember_me is active)
  86. request.env['rack.session.options'][:expire_after] = -1.year
  87. request.env['rack.session.options'][:renew] = true
  88. render :json => { }
  89. end
  90. def create_omniauth
  91. auth = request.env['omniauth.auth']
  92. if !auth
  93. logger.info("AUTH IS NULL, SERVICE NOT LINKED TO ACCOUNT")
  94. # redirect to app
  95. redirect_to '/'
  96. end
  97. # Create a new user or add an auth to existing user, depending on
  98. # whether there is already a user signed in.
  99. authorization = Authorization.find_from_hash(auth)
  100. if !authorization
  101. authorization = Authorization.create_from_hash(auth, current_user)
  102. end
  103. # remember last login date
  104. authorization.user.update_last_login
  105. # Log the authorizing user in.
  106. session[:user_id] = authorization.user.id
  107. # redirect to app
  108. redirect_to '/'
  109. end
  110. def create_sso
  111. user = User.sso(params)
  112. # Log the authorizing user in.
  113. if user
  114. session[:user_id] = user.id
  115. end
  116. # redirect to app
  117. redirect_to '/#'
  118. end
  119. def list
  120. return if deny_if_not_role('Admin')
  121. sessions = ActiveRecord::SessionStore::Session.order('updated_at DESC').limit(10000)
  122. users = {}
  123. sessions_clean = []
  124. sessions.each {|session|
  125. next if !session.data['user_id']
  126. sessions_clean.push session
  127. if session.data['user_id']
  128. if !users[ session.data['user_id'] ]
  129. users[ session.data['user_id'] ] = User.user_data_full( session.data['user_id'] )
  130. end
  131. end
  132. }
  133. render :json => {
  134. :sessions => sessions_clean,
  135. :users => users,
  136. }
  137. end
  138. def delete_old
  139. ActiveRecord::SessionStore::Session.where('request_type = ? AND updated_at < ?', 1, Time.now - 90.days ).delete_all
  140. ActiveRecord::SessionStore::Session.where('request_type = ? AND updated_at < ?', 2, Time.now - 2.days ).delete_all
  141. render :json => {}
  142. end
  143. def delete
  144. return if deny_if_not_role('Admin')
  145. session = ActiveRecord::SessionStore::Session.where( :id => params[:id] ).first
  146. if session
  147. session.destroy
  148. end
  149. render :json => {}
  150. end
  151. end