module ActiveStorage::DirectUploadToken

Constants

DIRECT_UPLOAD_TOKEN_LENGTH
SEPARATOR

Public Instance Methods

generate_direct_upload_token(attachment_name, service_name, session) click to toggle source
# File lib/active_storage/direct_upload_token.rb, line 10
def generate_direct_upload_token(attachment_name, service_name, session)
  token = direct_upload_token(session, attachment_name)
  encode_direct_upload_token([service_name, token].join(SEPARATOR))
end
verify_direct_upload_token(token, attachment_name, session) click to toggle source
# File lib/active_storage/direct_upload_token.rb, line 15
def verify_direct_upload_token(token, attachment_name, session)
  raise ActiveStorage::InvalidDirectUploadTokenError if token.nil?

  service_name, *token_components = decode_token(token).split(SEPARATOR)
  decoded_token = token_components.join(SEPARATOR)

  return service_name if valid_direct_upload_token?(decoded_token, attachment_name, session)

  raise ActiveStorage::InvalidDirectUploadTokenError
end

Private Instance Methods

direct_upload_token(session, attachment_name) click to toggle source
# File lib/active_storage/direct_upload_token.rb, line 27
def direct_upload_token(session, attachment_name) # :doc:
  direct_upload_token_hmac(session, "direct_upload##{attachment_name}")
end
direct_upload_token_hmac(session, identifier) click to toggle source
# File lib/active_storage/direct_upload_token.rb, line 38
def direct_upload_token_hmac(session, identifier) # :doc:
  OpenSSL::HMAC.digest(
    OpenSSL::Digest::SHA256.new,
    real_direct_upload_token(session),
    identifier
  )
end
real_direct_upload_token(session) click to toggle source
# File lib/active_storage/direct_upload_token.rb, line 46
def real_direct_upload_token(session) # :doc:
  session[:_direct_upload_token] ||= SecureRandom.urlsafe_base64(DIRECT_UPLOAD_TOKEN_LENGTH, padding: false)
  encode_direct_upload_token(session[:_direct_upload_token])
end
valid_direct_upload_token?(token, attachment_name, session) click to toggle source
# File lib/active_storage/direct_upload_token.rb, line 31
def valid_direct_upload_token?(token, attachment_name, session) # :doc:
  correct_token = direct_upload_token(session, attachment_name)
  ActiveSupport::SecurityUtils.fixed_length_secure_compare(token, correct_token)
rescue ArgumentError
  raise ActiveStorage::InvalidDirectUploadTokenError
end