require "sinatra" require "mini_magick" require "tempfile" MiniMagick.logger.level = Logger::DEBUG ROOT = ENV.fetch("ROOT") KEY = ENV.fetch("KEY") DITHER = ENV["DITHER"] != "0" FORMAT = "png" get "/*" do |path| halt 404, {"Content-Type" => "text/plain"}, "not found" unless File.exist?("#{ROOT}/#{path}.enc") content_type "image/#{FORMAT}" geometry = params["geo"] unless params["geo"] == "" geometry.gsub!(/\d+/) { |n| n.to_i * 2 } if geometry && !DITHER decrypted = Tempfile.new(["dither", File.extname(path)]) decrypted.binmode decrypted.close begin openssl_ok = system( "openssl", "aes-256-cbc", "-d", "-in", "#{ROOT}/#{path}.enc", "-out", decrypted.path, "-pass", "file:#{KEY}", "-iter", "1000000" ) halt 500, {"Content-Type" => "text/plain"}, "decrypt failed" unless openssl_ok convert = MiniMagick::Tool::Convert.new convert.limit("memory", "128MiB") convert.limit("map", "256MiB") convert.limit("disk", "1GiB") convert << decrypted.path convert.background("white") convert.layers("flatten") convert.strip convert.auto_orient if geometry if geometry.match?(/^\d+x\d+$/) convert.resize "#{geometry}^" convert.gravity "center" convert.extent geometry else convert.resize geometry end end if DITHER convert.ordered_dither "o8x8" convert.monochrome end convert << "#{FORMAT.upcase}:-" convert.call ensure decrypted.unlink end end