# frozen_string_literal: true # Alojar el sitio como un servicio oculto de Tor, que en realidad es un # link simbólico al DeployLocal. class DeployHiddenService < DeployWww validates :hostname, format: { with: /\A[a-z2-7]{56}.onion\z/ } # Los servicios ocultos son su propio transporte cifrado y # autenticado. # # @return [String] def url "http://#{hostname}" end # Los onions no son creados por Sutty sino por Tor y enviados luego a # través de la API. El hostname por defecto es un nombre temporal que # se parece a una dirección OnionV3. # # @return [String] def default_hostname "temporal#{random_base32}.onion" end private def implements_hostname_validation? true end # Adaptado de base32 # # @see {https://github.com/stesla/base32/blob/master/lib/base32.rb} # @see {https://github.com/stesla/base32/blob/master/LICENSE} def random_base32(length = 48) table = 'abcdefghijklmnopqrstuvwxyz234567' OpenSSL::Random.random_bytes(length).each_byte.map do |b| table[b % 32] end.join end end