token.rb 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. # Copyright (C) 2012-2016 Zammad Foundation, http://zammad-foundation.org/
  2. class Token < ActiveRecord::Base
  3. before_create :generate_token
  4. belongs_to :user
  5. store :preferences
  6. =begin
  7. create new token
  8. token = Token.create(action: 'PasswordReset', user_id: user.id)
  9. returns
  10. the token
  11. create new persistent token
  12. token = Token.create(
  13. action: 'api',
  14. persistent: true,
  15. user_id: user.id,
  16. preferences: {
  17. permission: {
  18. 'user_preferences.calendar' => true,
  19. }
  20. }
  21. )
  22. in case if you use it via an controller, e. g. you can verify via "curl -H "Authorization: Token token=33562a00d7eda2a7c2fb639b91c6bcb8422067b6" http://...
  23. returns
  24. the token
  25. =end
  26. =begin
  27. check token
  28. user = Token.check(action: 'PasswordReset', name: '123abc12qweads')
  29. check api token with permissions
  30. user = Token.check(action: 'api', name: '123abc12qweads', permission: 'admin.session')
  31. returns
  32. user for who this token was created
  33. =end
  34. def self.check(data)
  35. # fetch token
  36. token = Token.find_by(action: data[:action], name: data[:name])
  37. return if !token
  38. # check if token is still valid
  39. if !token.persistent &&
  40. token.created_at < 1.day.ago
  41. # delete token
  42. token.delete
  43. token.save
  44. return
  45. end
  46. user = token.user
  47. # persistent token not valid if user is inactive
  48. if !data[:inactive_user]
  49. return if token.persistent && user.active == false
  50. end
  51. # add permission check
  52. if data[:permission]
  53. return if !user.permissions?(data[:permission])
  54. return if !token.preferences[:permission]
  55. local_permissions = data[:permission]
  56. if data[:permission].class != Array
  57. local_permissions = [data[:permission]]
  58. end
  59. match = false
  60. local_permissions.each { |local_permission|
  61. next if !token.preferences[:permission].include?(local_permission)
  62. match = true
  63. break
  64. }
  65. return if !match
  66. end
  67. # return token user
  68. user
  69. end
  70. =begin
  71. cleanup old token
  72. Token.cleanup
  73. =end
  74. def self.cleanup
  75. Token.where('persistent IS ? AND created_at < ?', nil, Time.zone.now - 30.days).delete_all
  76. true
  77. end
  78. private
  79. def generate_token
  80. loop do
  81. self.name = SecureRandom.urlsafe_base64(48)
  82. break if !Token.exists?(name: name)
  83. end
  84. end
  85. end