diff options
author | David Heinemeier Hansson <david@loudthinking.com> | 2017-07-03 20:14:28 +0200 |
---|---|---|
committer | David Heinemeier Hansson <david@loudthinking.com> | 2017-07-03 20:14:28 +0200 |
commit | d2ff19c39c097aa17d16e33c8de981f43cd1ffa0 (patch) | |
tree | 798b8a30e1b238c9f7934c5be2aba35557bbebd9 /lib/active_file/sites | |
parent | dca8d548b01407d21e660d7f9759d07d67329e07 (diff) | |
download | rails-d2ff19c39c097aa17d16e33c8de981f43cd1ffa0.tar.gz rails-d2ff19c39c097aa17d16e33c8de981f43cd1ffa0.tar.bz2 rails-d2ff19c39c097aa17d16e33c8de981f43cd1ffa0.zip |
WIP: Disk URLs
Diffstat (limited to 'lib/active_file/sites')
-rw-r--r-- | lib/active_file/sites/disk_site.rb | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/lib/active_file/sites/disk_site.rb b/lib/active_file/sites/disk_site.rb index ee39b7a736..da1e69df03 100644 --- a/lib/active_file/sites/disk_site.rb +++ b/lib/active_file/sites/disk_site.rb @@ -2,6 +2,42 @@ require "fileutils" require "pathname" class ActiveFile::Sites::DiskSite < ActiveFile::Site + class_attribute :verifier, default: -> { Rails.application.message_verifier('ActiveFile::DiskSite') } + + class << self + def generate_verifiable_key(key, expires_in:) + VerifiedKeyWithExpiration + end + end + + class VerifiableKeyWithExpiration + def initialize(verifiable_key_with_expiration) + verified_key_with_expiration = ActiveFile::Sites::DiskSite.verify(verifiable_key_with_expiration) + + @key = verified_key_with_expiration[:key] + @expires_at = verified_key_with_expiration[:expires_at] + end + + def expired? + @expires_at && Time.now.utc > @expires_at + end + + def decoded + key + end + end + + class VerifiedKeyWithExpiration + def initialize(key, expires_in: nil) + @key = key + @expires_at = Time.now.utc.advance(sec: expires_in) + end + + def encoded + ActiveFile::Sites::DiskSite.verify.generate({ key: @key, expires_at: @expires_at }) + end + end + attr_reader :root def initialize(root:) @@ -38,6 +74,14 @@ class ActiveFile::Sites::DiskSite < ActiveFile::Site end + def url(key, disposition:, expires_in: nil) + if defined?(Rails) + Rails.application.routes.url_helpers.rails_disk_blob_path(key) + else + "/rails/blobs/#{key}" + end + end + def byte_size(key) File.size path_for(key) end @@ -48,6 +92,10 @@ class ActiveFile::Sites::DiskSite < ActiveFile::Site private + def verifiable_key_with_expiration(key, expires_in: nil) + verifier.generate key: key, expires_at: Time.now.utc.advance(sec: expires_in) + end + def path_for(key) File.join root, folder_for(key), key end |