2020-12-08 23:21:42 +00:00
|
|
|
# frozen_string_literal: true
|
|
|
|
|
|
|
|
# CORS
|
|
|
|
#
|
|
|
|
# @see {https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS}
|
|
|
|
# @see {https://github.com/cyu/rack-cors#origin}
|
|
|
|
Rails.application.config.middleware.insert_before 0, Rack::Cors do
|
|
|
|
allow do
|
2020-12-08 23:37:26 +00:00
|
|
|
# Queremos obtener un dominio válido y no permitir ningún otro
|
|
|
|
# origen. Como los sitios pueden tener muchos orígenes, necesitamos
|
|
|
|
# una forma de encontrarlos por su URL.
|
|
|
|
#
|
|
|
|
# El problema sería que otros sitios con JS malicioso hagan pedidos
|
|
|
|
# a nuestra API desde otros sitios infectados.
|
|
|
|
#
|
|
|
|
# XXX: La primera parte del dominio tiene que coincidir con el
|
|
|
|
# nombre del sitio.
|
|
|
|
#
|
|
|
|
# XXX: Al terminar de entender esto nos pasó que el servidor recibe
|
|
|
|
# la petición de todas maneras, con lo que no estamos previniendo
|
2020-12-08 23:39:09 +00:00
|
|
|
# que nos hablen, sino que lean información. Solo va a funcionar si
|
|
|
|
# el servidor no tiene el Preflight cacheado.
|
2020-12-08 23:37:26 +00:00
|
|
|
#
|
|
|
|
# TODO: Limitar el acceso desde Nginx también.
|
2020-12-08 23:39:09 +00:00
|
|
|
#
|
2020-12-08 23:37:26 +00:00
|
|
|
# TODO: Poder consultar por sitios por todas sus URLs posibles.
|
|
|
|
origins do |source, _|
|
|
|
|
# Cacheamos la respuesta para no tener que volver a procesarla
|
|
|
|
# cada vez.
|
|
|
|
Rails.cache.fetch(source, expires_in: 1.hour) do
|
2021-03-20 16:10:47 +00:00
|
|
|
uri = URI(source)
|
|
|
|
|
|
|
|
if (name = uri&.host&.split('.', 2)&.first).present?
|
|
|
|
Site.where(name: [name, uri.host + '.']).pluck(:name).first.present?
|
2020-12-08 23:37:26 +00:00
|
|
|
else
|
|
|
|
false
|
|
|
|
end
|
|
|
|
rescue URI::Error
|
|
|
|
false
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2020-12-08 23:21:42 +00:00
|
|
|
resource '*', headers: :any, methods: %i[get post patch put]
|
|
|
|
end
|
|
|
|
end
|