external_credential.rb 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. # Copyright (C) 2012-2025 Zammad Foundation, https://zammad-foundation.org/
  2. class ExternalCredential < ApplicationModel
  3. include ApplicationLib
  4. validates :name, presence: true
  5. store :credentials
  6. after_update_commit :update_client_secret
  7. def self.app_verify(params)
  8. backend = load_backend(params[:provider])
  9. backend.app_verify(params)
  10. end
  11. def self.request_account_to_link(provider, params = {})
  12. backend = load_backend(provider)
  13. backend.request_account_to_link(params)
  14. end
  15. def self.link_account(provider, request_token, params)
  16. backend = load_backend(provider)
  17. backend.link_account(request_token, params)
  18. end
  19. def self.callback_url(provider)
  20. "#{Setting.get('http_type')}://#{Setting.get('fqdn')}#{Rails.configuration.api_path}/external_credentials/#{provider}/callback"
  21. end
  22. def self.app_url(provider, channel_id)
  23. "#{Setting.get('http_type')}://#{Setting.get('fqdn')}/#channels/#{provider}/#{channel_id}"
  24. end
  25. def self.refresh_token(provider, params)
  26. backend = ExternalCredential.load_backend(provider)
  27. backend.refresh_token(params)
  28. end
  29. def self.load_backend(provider)
  30. "ExternalCredential::#{provider.camelcase}".constantize
  31. end
  32. private
  33. def update_client_secret
  34. return if !saved_change_to_credentials?
  35. previous_client_secret = saved_changes['credentials'].first['client_secret']
  36. current_client_secret = saved_changes['credentials'].last['client_secret']
  37. return if previous_client_secret.blank? || current_client_secret.blank?
  38. return if previous_client_secret == current_client_secret
  39. backend = ExternalCredential.load_backend(name)
  40. return if !backend.respond_to?(:update_client_secret)
  41. backend.update_client_secret(previous_client_secret, current_client_secret)
  42. end
  43. end