sessions_controller.rb 4.8 KB

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