You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

mem_cache_store.rb 2.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. # frozen_string_literal: false
  2. require 'digest/sha1'
  3. require 'openid/store/interface'
  4. module OpenIdAuthentication
  5. class MemCacheStore < OpenID::Store::Interface
  6. def initialize(*addresses)
  7. @connection = ActiveSupport::Cache::MemCacheStore.new(addresses)
  8. end
  9. def store_association(server_url, assoc)
  10. server_key = association_server_key(server_url)
  11. assoc_key = association_key(server_url, assoc.handle)
  12. assocs = @connection.read(server_key) || {}
  13. assocs[assoc.issued] = assoc_key
  14. @connection.write(server_key, assocs)
  15. @connection.write(assoc_key, assoc, :expires_in => assoc.lifetime)
  16. end
  17. def get_association(server_url, handle = nil)
  18. if handle
  19. @connection.read(association_key(server_url, handle))
  20. else
  21. server_key = association_server_key(server_url)
  22. assocs = @connection.read(server_key)
  23. return if assocs.nil?
  24. last_key = assocs[assocs.keys.sort.last]
  25. @connection.read(last_key)
  26. end
  27. end
  28. def remove_association(server_url, handle)
  29. server_key = association_server_key(server_url)
  30. assoc_key = association_key(server_url, handle)
  31. assocs = @connection.read(server_key)
  32. return false unless assocs && assocs.has_value?(assoc_key)
  33. assocs = assocs.delete_if { |key, value| value == assoc_key }
  34. @connection.write(server_key, assocs)
  35. @connection.delete(assoc_key)
  36. return true
  37. end
  38. def use_nonce(server_url, timestamp, salt)
  39. return false if @connection.read(nonce_key(server_url, salt))
  40. return false if (timestamp - Time.now.to_i).abs > OpenID::Nonce.skew
  41. @connection.write(nonce_key(server_url, salt), timestamp, :expires_in => OpenID::Nonce.skew)
  42. return true
  43. end
  44. private
  45. def association_key(server_url, handle = nil)
  46. "openid_association_#{digest(server_url)}_#{digest(handle)}"
  47. end
  48. def association_server_key(server_url)
  49. "openid_association_server_#{digest(server_url)}"
  50. end
  51. def nonce_key(server_url, salt)
  52. "openid_nonce_#{digest(server_url)}_#{digest(salt)}"
  53. end
  54. def digest(text)
  55. Digest::SHA1.hexdigest(text)
  56. end
  57. end
  58. end