Sha256: e7f7f63ff573f911718b7e152a11b81515f1a6fa0a72191f2bf1450280fd75fa

Contents?: true

Size: 1.4 KB

Versions: 9

Compression:

Stored size: 1.4 KB

Contents

# frozen_string_literal: true

module Decidim
  class InvalidUrlError < StandardError; end

  class LinksController < Decidim::ApplicationController
    skip_before_action :store_current_location

    helper Decidim::ExternalDomainHelper
    helper_method :external_url

    before_action :parse_url
    rescue_from Decidim::InvalidUrlError, with: :modal
    rescue_from URI::InvalidURIError, with: :modal

    def new
      headers["X-Robots-Tag"] = "none"
      headers["Link"] = %(<#{url_for}>; rel="canonical")
    end

    private

    def modal
      flash[:alert] = I18n.t("decidim.links.invalid_url")

      if request.xhr?
        render "modal"
      else
        redirect_to decidim.root_path
      end
    end

    def parse_url
      raise Decidim::InvalidUrlError if params[:external_url].blank?
      raise Decidim::InvalidUrlError unless external_url
      raise Decidim::InvalidUrlError unless %w(http https).include?(external_url.scheme)
    end

    def external_url
      @external_url ||= URI.parse(escape_url(params[:external_url]))
    end

    def escape_url(external_url)
      before_fragment, fragment = external_url.split("#", 2)
      escaped_before_fragment = URI::Parser.new.escape(before_fragment)

      if fragment
        escaped_fragment = URI::Parser.new.escape(fragment)
        "#{escaped_before_fragment}##{escaped_fragment}"
      else
        escaped_before_fragment
      end
    end
  end
end

Version data entries

9 entries across 9 versions & 1 rubygems

Version Path
decidim-core-0.29.1 app/controllers/decidim/links_controller.rb
decidim-core-0.28.4 app/controllers/decidim/links_controller.rb
decidim-core-0.29.0 app/controllers/decidim/links_controller.rb
decidim-core-0.28.3 app/controllers/decidim/links_controller.rb
decidim-core-0.29.0.rc4 app/controllers/decidim/links_controller.rb
decidim-core-0.29.0.rc3 app/controllers/decidim/links_controller.rb
decidim-core-0.29.0.rc2 app/controllers/decidim/links_controller.rb
decidim-core-0.29.0.rc1 app/controllers/decidim/links_controller.rb
decidim-core-0.28.2 app/controllers/decidim/links_controller.rb