2020-02-11 15:06:36 +00:00
|
|
|
# frozen_string_literal: true
|
|
|
|
|
|
|
|
module Api
|
|
|
|
module V1
|
2020-05-30 19:43:25 +00:00
|
|
|
# Obtiene una cookie válida por el tiempo especificado por el
|
|
|
|
# sitio.
|
|
|
|
#
|
|
|
|
# Aunque visitemos el sitio varias veces enviando la cookie
|
|
|
|
# anterior, la cookie se renueva.
|
2020-02-11 15:06:36 +00:00
|
|
|
class InvitadesController < BaseController
|
2020-05-30 19:43:25 +00:00
|
|
|
# Cookie para el formulario de contacto
|
|
|
|
def contact_cookie
|
|
|
|
@site, contact = Site.where(name: site_id, contact: true)
|
|
|
|
.pluck(:name, :contact)
|
|
|
|
.first
|
|
|
|
|
|
|
|
set_cookie if contact
|
|
|
|
|
|
|
|
render file: Rails.root.join('public', '1x1.png'),
|
|
|
|
content_type: 'image/png',
|
|
|
|
layout: false
|
|
|
|
end
|
|
|
|
|
|
|
|
# Cookie para colaboraciones anónimas
|
2020-02-11 15:06:36 +00:00
|
|
|
def cookie
|
|
|
|
# XXX: Prestar atención a que estas acciones sean lo más rápidas
|
|
|
|
# y utilicen la menor cantidad posible de recursos, porque son
|
|
|
|
# un vector de DDOS.
|
2020-05-30 19:43:25 +00:00
|
|
|
@site, anon = Site.where(name: site_id, colaboracion_anonima: true)
|
|
|
|
.pluck(:name, :colaboracion_anonima)
|
|
|
|
.first
|
2020-02-11 15:06:36 +00:00
|
|
|
|
2020-05-30 19:43:25 +00:00
|
|
|
set_cookie if anon
|
|
|
|
|
|
|
|
render json: {}, status: :ok
|
|
|
|
end
|
|
|
|
|
|
|
|
private
|
|
|
|
|
|
|
|
# La cookie no es accesible a través de JS y todo su contenido
|
|
|
|
# está cifrado para que no lo modifiquen les visitantes
|
|
|
|
#
|
|
|
|
# Enviamos un token de protección CSRF
|
|
|
|
def set_cookie
|
|
|
|
expires = 30.minutes
|
|
|
|
cookies.encrypted[@site] = {
|
|
|
|
httponly: true,
|
|
|
|
secure: !Rails.env.test?,
|
|
|
|
expires: expires,
|
|
|
|
same_site: :none,
|
|
|
|
value: {
|
|
|
|
csrf: form_authenticity_token,
|
|
|
|
expires: (Time.now + expires).to_i
|
|
|
|
}
|
|
|
|
}
|
2020-02-11 15:06:36 +00:00
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|