qiita-markdown 0.27.0 → 0.32.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of qiita-markdown might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/CHANGELOG.md +26 -0
- data/lib/qiita/markdown.rb +6 -0
- data/lib/qiita/markdown/embed/code_pen.rb +1 -0
- data/lib/qiita/markdown/embed/gist.rb +9 -0
- data/lib/qiita/markdown/embed/google_slide.rb +9 -0
- data/lib/qiita/markdown/embed/slide_share.rb +9 -0
- data/lib/qiita/markdown/embed/speeker_deck.rb +16 -0
- data/lib/qiita/markdown/embed/youtube.rb +12 -0
- data/lib/qiita/markdown/filters/final_sanitizer.rb +7 -3
- data/lib/qiita/markdown/filters/user_input_sanitizer.rb +14 -2
- data/lib/qiita/markdown/transformers/filter_iframe.rb +54 -0
- data/lib/qiita/markdown/transformers/filter_script.rb +6 -1
- data/lib/qiita/markdown/version.rb +1 -1
- data/qiita-markdown.gemspec +1 -1
- data/spec/qiita/markdown/processor_spec.rb +205 -1
- metadata +15 -10
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA256:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: 1e3469d19ed195eb7a7ccdeeedaa1503154a262893c882768834c8636fad0ae7
         | 
| 4 | 
            +
              data.tar.gz: 3b9fec449730dcf1f19ec3d84247a7b1d89e1f785e9b52eace389cedfb9045c3
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: cab8938cb167a8c41d6b68478f562f87e5c06a6f412c4f4e0b12c9450cb7506c380eb9ab7ef3ae73eca991d50bbb1da8d5d3e5da4a0e7fdece14ebea15053e1f
         | 
| 7 | 
            +
              data.tar.gz: 5e74b4610be3b012d1cd381ecc5e3efc41f581da095ae3a6d5836dc3b62297c7d7deac6d0e93d1c32d84385baea699bfff6f804e1f5924539b3468703d01cd94
         | 
    
        data/CHANGELOG.md
    CHANGED
    
    | @@ -1,5 +1,31 @@ | |
| 1 1 | 
             
            ## Unreleased
         | 
| 2 2 |  | 
| 3 | 
            +
            ## 0.32.0
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            - Fixed XSS possibility bug
         | 
| 6 | 
            +
            - Fix iframe width to be fixed at 100%
         | 
| 7 | 
            +
             | 
| 8 | 
            +
            ## 0.31.0
         | 
| 9 | 
            +
             | 
| 10 | 
            +
            - Use greenmat 3.5.1.1
         | 
| 11 | 
            +
             | 
| 12 | 
            +
            ## 0.30.0
         | 
| 13 | 
            +
             | 
| 14 | 
            +
            - Use greenmat 3.5.1.0
         | 
| 15 | 
            +
             | 
| 16 | 
            +
            ## 0.29.0
         | 
| 17 | 
            +
             | 
| 18 | 
            +
            - Accept new embeded script and iframes
         | 
| 19 | 
            +
                - Gist
         | 
| 20 | 
            +
                - Youtube
         | 
| 21 | 
            +
                - SlideShare
         | 
| 22 | 
            +
                - SpeekerDeck
         | 
| 23 | 
            +
                - GoogleSlide
         | 
| 24 | 
            +
             | 
| 25 | 
            +
            ## 0.28.0
         | 
| 26 | 
            +
             | 
| 27 | 
            +
            - Accept new codepen script url (cpwebassets.codepen.io)
         | 
| 28 | 
            +
             | 
| 3 29 | 
             
            ## 0.27.0
         | 
| 4 30 |  | 
| 5 31 | 
             
            - Support embed Asciinema
         | 
    
        data/lib/qiita/markdown.rb
    CHANGED
    
    | @@ -10,8 +10,14 @@ require "sanitize" | |
| 10 10 | 
             
            require "qiita/markdown/embed/code_pen"
         | 
| 11 11 | 
             
            require "qiita/markdown/embed/tweet"
         | 
| 12 12 | 
             
            require "qiita/markdown/embed/asciinema"
         | 
| 13 | 
            +
            require "qiita/markdown/embed/gist"
         | 
| 14 | 
            +
            require "qiita/markdown/embed/youtube"
         | 
| 15 | 
            +
            require "qiita/markdown/embed/slide_share"
         | 
| 16 | 
            +
            require "qiita/markdown/embed/google_slide"
         | 
| 17 | 
            +
            require "qiita/markdown/embed/speeker_deck"
         | 
| 13 18 | 
             
            require "qiita/markdown/transformers/filter_attributes"
         | 
| 14 19 | 
             
            require "qiita/markdown/transformers/filter_script"
         | 
| 20 | 
            +
            require "qiita/markdown/transformers/filter_iframe"
         | 
| 15 21 | 
             
            require "qiita/markdown/transformers/strip_invalid_node"
         | 
| 16 22 | 
             
            require "qiita/markdown/filters/checkbox"
         | 
| 17 23 | 
             
            require "qiita/markdown/filters/code_block"
         | 
| @@ -0,0 +1,16 @@ | |
| 1 | 
            +
            module Qiita
         | 
| 2 | 
            +
              module Markdown
         | 
| 3 | 
            +
                module Embed
         | 
| 4 | 
            +
                  module SpeekerDeck
         | 
| 5 | 
            +
                    SCRIPT_URLS = [
         | 
| 6 | 
            +
                      "//speakerdeck.com/assets/embed.js",
         | 
| 7 | 
            +
                    ].freeze
         | 
| 8 | 
            +
                    CLASS_NAME = %w[speakerdeck-embed].freeze
         | 
| 9 | 
            +
                    DATA_ATTRIBUTES = %w[
         | 
| 10 | 
            +
                      data-id data-ratio
         | 
| 11 | 
            +
                    ].freeze
         | 
| 12 | 
            +
                    ATTRIBUTES = %w[class] + DATA_ATTRIBUTES
         | 
| 13 | 
            +
                  end
         | 
| 14 | 
            +
                end
         | 
| 15 | 
            +
              end
         | 
| 16 | 
            +
            end
         | 
| @@ -47,7 +47,9 @@ module Qiita | |
| 47 47 | 
             
                          "async",
         | 
| 48 48 | 
             
                          "src",
         | 
| 49 49 | 
             
                          "type",
         | 
| 50 | 
            -
                        ] | 
| 50 | 
            +
                        ].concat(
         | 
| 51 | 
            +
                          Embed::SpeekerDeck::ATTRIBUTES,
         | 
| 52 | 
            +
                        ),
         | 
| 51 53 | 
             
                        "span" => [
         | 
| 52 54 | 
             
                          "style",
         | 
| 53 55 | 
             
                        ],
         | 
| @@ -137,6 +139,7 @@ module Qiita | |
| 137 139 | 
             
                        "s",
         | 
| 138 140 | 
             
                        "samp",
         | 
| 139 141 | 
             
                        "script",
         | 
| 142 | 
            +
                        "iframe",
         | 
| 140 143 | 
             
                        "span",
         | 
| 141 144 | 
             
                        "strike",
         | 
| 142 145 | 
             
                        "strong",
         | 
| @@ -186,14 +189,15 @@ module Qiita | |
| 186 189 | 
             
                      transformers: [
         | 
| 187 190 | 
             
                        Transformers::StripInvalidNode,
         | 
| 188 191 | 
             
                        Transformers::FilterScript,
         | 
| 192 | 
            +
                        Transformers::FilterIframe,
         | 
| 189 193 | 
             
                      ],
         | 
| 190 194 | 
             
                    }.freeze
         | 
| 191 195 |  | 
| 192 196 | 
             
                    SCRIPTABLE_RULE = RULE.dup.tap do |rule|
         | 
| 193 197 | 
             
                      rule[:attributes] = RULE[:attributes].dup
         | 
| 194 198 | 
             
                      rule[:attributes][:all] = rule[:attributes][:all] + [:data]
         | 
| 195 | 
            -
                      rule[:elements] = RULE[:elements] + [" | 
| 196 | 
            -
                      rule[:transformers] = rule[:transformers] - [Transformers::FilterScript]
         | 
| 199 | 
            +
                      rule[:elements] = RULE[:elements] + ["video"]
         | 
| 200 | 
            +
                      rule[:transformers] = rule[:transformers] - [Transformers::FilterScript, Transformers::FilterIframe]
         | 
| 197 201 | 
             
                    end
         | 
| 198 202 |  | 
| 199 203 | 
             
                    def call
         | 
| @@ -6,7 +6,7 @@ module Qiita | |
| 6 6 | 
             
                    RULE = {
         | 
| 7 7 | 
             
                      elements: %w[
         | 
| 8 8 | 
             
                        a b blockquote br code dd del details div dl dt em font h1 h2 h3 h4 h5 h6
         | 
| 9 | 
            -
                        hr i img ins kbd li ol p pre q rp rt ruby s samp script strike strong sub
         | 
| 9 | 
            +
                        hr i img ins kbd li ol p pre q rp rt ruby s samp script iframe strike strong sub
         | 
| 10 10 | 
             
                        summary sup table tbody td tfoot th thead tr ul var
         | 
| 11 11 | 
             
                      ],
         | 
| 12 12 | 
             
                      attributes: {
         | 
| @@ -26,7 +26,18 @@ module Qiita | |
| 26 26 | 
             
                        "li"         => %w[id],
         | 
| 27 27 | 
             
                        "p"          => Embed::CodePen::ATTRIBUTES,
         | 
| 28 28 | 
             
                        "q"          => %w[cite],
         | 
| 29 | 
            -
                        "script"     => %w[async src id],
         | 
| 29 | 
            +
                        "script"     => %w[async src id].concat(Embed::SpeekerDeck::ATTRIBUTES),
         | 
| 30 | 
            +
                        "iframe"     => %w[
         | 
| 31 | 
            +
                          allowfullscreen
         | 
| 32 | 
            +
                          frameborder
         | 
| 33 | 
            +
                          height
         | 
| 34 | 
            +
                          marginheight
         | 
| 35 | 
            +
                          marginwidth
         | 
| 36 | 
            +
                          scrolling
         | 
| 37 | 
            +
                          src
         | 
| 38 | 
            +
                          style
         | 
| 39 | 
            +
                          width
         | 
| 40 | 
            +
                        ],
         | 
| 30 41 | 
             
                        "sup"        => %w[id],
         | 
| 31 42 | 
             
                        "td"         => %w[colspan rowspan style],
         | 
| 32 43 | 
             
                        "th"         => %w[colspan rowspan style],
         | 
| @@ -42,6 +53,7 @@ module Qiita | |
| 42 53 | 
             
                      transformers: [
         | 
| 43 54 | 
             
                        Transformers::FilterAttributes,
         | 
| 44 55 | 
             
                        Transformers::FilterScript,
         | 
| 56 | 
            +
                        Transformers::FilterIframe,
         | 
| 45 57 | 
             
                      ],
         | 
| 46 58 | 
             
                    }.freeze
         | 
| 47 59 |  | 
| @@ -0,0 +1,54 @@ | |
| 1 | 
            +
            module Qiita
         | 
| 2 | 
            +
              module Markdown
         | 
| 3 | 
            +
                module Transformers
         | 
| 4 | 
            +
                  class FilterIframe
         | 
| 5 | 
            +
                    URL_WHITE_LIST = [
         | 
| 6 | 
            +
                    ].flatten.freeze
         | 
| 7 | 
            +
             | 
| 8 | 
            +
                    HOST_WHITE_LIST = [
         | 
| 9 | 
            +
                      Embed::Youtube::SCRIPT_HOSTS,
         | 
| 10 | 
            +
                      Embed::SlideShare::SCRIPT_HOST,
         | 
| 11 | 
            +
                      Embed::GoogleSlide::SCRIPT_HOST,
         | 
| 12 | 
            +
                    ].flatten.freeze
         | 
| 13 | 
            +
             | 
| 14 | 
            +
                    def self.call(*args)
         | 
| 15 | 
            +
                      new(*args).transform
         | 
| 16 | 
            +
                    end
         | 
| 17 | 
            +
             | 
| 18 | 
            +
                    def initialize(env)
         | 
| 19 | 
            +
                      @env = env
         | 
| 20 | 
            +
                    end
         | 
| 21 | 
            +
             | 
| 22 | 
            +
                    def transform
         | 
| 23 | 
            +
                      if name == "iframe"
         | 
| 24 | 
            +
                        if URL_WHITE_LIST.include?(node["src"]) || HOST_WHITE_LIST.include?(host_of(node["src"]))
         | 
| 25 | 
            +
                          node["width"] = "100%"
         | 
| 26 | 
            +
                          node.children.unlink
         | 
| 27 | 
            +
                        else
         | 
| 28 | 
            +
                          node.unlink
         | 
| 29 | 
            +
                        end
         | 
| 30 | 
            +
                      end
         | 
| 31 | 
            +
                    end
         | 
| 32 | 
            +
             | 
| 33 | 
            +
                    private
         | 
| 34 | 
            +
             | 
| 35 | 
            +
                    def name
         | 
| 36 | 
            +
                      @env[:node_name]
         | 
| 37 | 
            +
                    end
         | 
| 38 | 
            +
             | 
| 39 | 
            +
                    def node
         | 
| 40 | 
            +
                      @env[:node]
         | 
| 41 | 
            +
                    end
         | 
| 42 | 
            +
             | 
| 43 | 
            +
                    def host_of(url)
         | 
| 44 | 
            +
                      if url
         | 
| 45 | 
            +
                        port = URI.parse(url).port
         | 
| 46 | 
            +
                        Addressable::URI.parse(url).host if [443, 80].include? port
         | 
| 47 | 
            +
                      end
         | 
| 48 | 
            +
                    rescue Addressable::URI::InvalidURIError
         | 
| 49 | 
            +
                      nil
         | 
| 50 | 
            +
                    end
         | 
| 51 | 
            +
                  end
         | 
| 52 | 
            +
                end
         | 
| 53 | 
            +
              end
         | 
| 54 | 
            +
            end
         | 
| @@ -5,10 +5,12 @@ module Qiita | |
| 5 5 | 
             
                    URL_WHITE_LIST = [
         | 
| 6 6 | 
             
                      Embed::CodePen::SCRIPT_URLS,
         | 
| 7 7 | 
             
                      Embed::Tweet::SCRIPT_URL,
         | 
| 8 | 
            +
                      Embed::SpeekerDeck::SCRIPT_URLS,
         | 
| 8 9 | 
             
                    ].flatten.freeze
         | 
| 9 10 |  | 
| 10 11 | 
             
                    HOST_WHITE_LIST = [
         | 
| 11 12 | 
             
                      Embed::Asciinema::SCRIPT_HOST,
         | 
| 13 | 
            +
                      Embed::Gist::SCRIPT_HOST,
         | 
| 12 14 | 
             
                    ].flatten.freeze
         | 
| 13 15 |  | 
| 14 16 | 
             
                    def self.call(*args)
         | 
| @@ -41,7 +43,10 @@ module Qiita | |
| 41 43 | 
             
                    end
         | 
| 42 44 |  | 
| 43 45 | 
             
                    def host_of(url)
         | 
| 44 | 
            -
                       | 
| 46 | 
            +
                      if url
         | 
| 47 | 
            +
                        port = URI.parse(url).port
         | 
| 48 | 
            +
                        Addressable::URI.parse(url).host if [443, 80].include? port
         | 
| 49 | 
            +
                      end
         | 
| 45 50 | 
             
                    rescue Addressable::URI::InvalidURIError
         | 
| 46 51 | 
             
                      nil
         | 
| 47 52 | 
             
                    end
         | 
    
        data/qiita-markdown.gemspec
    CHANGED
    
    | @@ -23,7 +23,7 @@ Gem::Specification.new do |spec| | |
| 23 23 | 
             
              spec.add_dependency "html-pipeline", "~> 2.0"
         | 
| 24 24 | 
             
              spec.add_dependency "mem"
         | 
| 25 25 | 
             
              spec.add_dependency "pygments.rb", "~> 1.0"
         | 
| 26 | 
            -
              spec.add_dependency "greenmat", "3. | 
| 26 | 
            +
              spec.add_dependency "greenmat", "3.5.1.1"
         | 
| 27 27 | 
             
              spec.add_dependency "sanitize"
         | 
| 28 28 | 
             
              spec.add_dependency "addressable"
         | 
| 29 29 | 
             
              spec.add_development_dependency "activesupport", "4.2.6"
         | 
| @@ -740,7 +740,7 @@ describe Qiita::Markdown::Processor do | |
| 740 740 |  | 
| 741 741 | 
             
                    it "generates footnotes elements" do
         | 
| 742 742 | 
             
                      should eq <<-HTML.strip_heredoc
         | 
| 743 | 
            -
                        <p><sup id="fnref1"><a href="#fn1"  | 
| 743 | 
            +
                        <p><sup id="fnref1"><a href="#fn1" title="test">1</a></sup></p>
         | 
| 744 744 |  | 
| 745 745 | 
             
                        <div class="footnotes">
         | 
| 746 746 | 
             
                        <hr>
         | 
| @@ -756,6 +756,25 @@ describe Qiita::Markdown::Processor do | |
| 756 756 | 
             
                    end
         | 
| 757 757 | 
             
                  end
         | 
| 758 758 |  | 
| 759 | 
            +
                  context "with footenotes syntax with code block" do
         | 
| 760 | 
            +
                    let(:markdown) do
         | 
| 761 | 
            +
                      <<-MARKDOWN.strip_heredoc
         | 
| 762 | 
            +
                        ```
         | 
| 763 | 
            +
                        [^1]
         | 
| 764 | 
            +
                        [^1]: test
         | 
| 765 | 
            +
                        ```
         | 
| 766 | 
            +
                      MARKDOWN
         | 
| 767 | 
            +
                    end
         | 
| 768 | 
            +
             | 
| 769 | 
            +
                    it "generates only code blocks without footnotes" do
         | 
| 770 | 
            +
                      should eq <<-HTML.strip_heredoc
         | 
| 771 | 
            +
                        <div class="code-frame" data-lang="text"><div class="highlight"><pre><span></span>[^1]
         | 
| 772 | 
            +
                        [^1]: test
         | 
| 773 | 
            +
                        </pre></div></div>
         | 
| 774 | 
            +
                      HTML
         | 
| 775 | 
            +
                    end
         | 
| 776 | 
            +
                  end
         | 
| 777 | 
            +
             | 
| 759 778 | 
             
                  context "with manually written link inside of <sup> tag" do
         | 
| 760 779 | 
             
                    let(:markdown) do
         | 
| 761 780 | 
             
                      <<-MARKDOWN.strip_heredoc
         | 
| @@ -1031,6 +1050,31 @@ describe Qiita::Markdown::Processor do | |
| 1031 1050 | 
             
                      end
         | 
| 1032 1051 | 
             
                    end
         | 
| 1033 1052 | 
             
                  end
         | 
| 1053 | 
            +
             | 
| 1054 | 
            +
                  context "with details tag" do
         | 
| 1055 | 
            +
                    let(:markdown) do
         | 
| 1056 | 
            +
                      <<-MARKDOWN.strip_heredoc
         | 
| 1057 | 
            +
                        <details><summary>Folding sample</summary><div>
         | 
| 1058 | 
            +
             | 
| 1059 | 
            +
                        ```rb
         | 
| 1060 | 
            +
                        puts "Hello, World"
         | 
| 1061 | 
            +
                        ```
         | 
| 1062 | 
            +
                        </div></details>
         | 
| 1063 | 
            +
                      MARKDOWN
         | 
| 1064 | 
            +
                    end
         | 
| 1065 | 
            +
             | 
| 1066 | 
            +
                    it "returns HTML output parsed as markdown" do
         | 
| 1067 | 
            +
                      expect(subject).to eq <<-HTML.strip_heredoc
         | 
| 1068 | 
            +
                        <p><details><summary>Folding sample</summary><div>
         | 
| 1069 | 
            +
             | 
| 1070 | 
            +
                        <div class="code-frame" data-lang="rb"><div class="highlight"><pre><span></span><span class="nb">puts</span> <span class="s2">"Hello, World"</span>
         | 
| 1071 | 
            +
                        </pre></div></div>
         | 
| 1072 | 
            +
             | 
| 1073 | 
            +
                        <p></p>
         | 
| 1074 | 
            +
                        </div></details></p>
         | 
| 1075 | 
            +
                      HTML
         | 
| 1076 | 
            +
                    end
         | 
| 1077 | 
            +
                  end
         | 
| 1034 1078 | 
             
                end
         | 
| 1035 1079 |  | 
| 1036 1080 | 
             
                shared_examples_for "script element" do |allowed:|
         | 
| @@ -1407,6 +1451,138 @@ describe Qiita::Markdown::Processor do | |
| 1407 1451 | 
             
                    end
         | 
| 1408 1452 | 
             
                  end
         | 
| 1409 1453 |  | 
| 1454 | 
            +
                  context "with HTML embed code for Gist" do
         | 
| 1455 | 
            +
                    let(:markdown) do
         | 
| 1456 | 
            +
                      <<-MARKDOWN.strip_heredoc
         | 
| 1457 | 
            +
                        <script id="example" src="https://gist.github.com/a/example.js"></script>
         | 
| 1458 | 
            +
                      MARKDOWN
         | 
| 1459 | 
            +
                    end
         | 
| 1460 | 
            +
             | 
| 1461 | 
            +
                    if allowed
         | 
| 1462 | 
            +
                      it "does not sanitize embed code" do
         | 
| 1463 | 
            +
                        should eq <<-HTML.strip_heredoc
         | 
| 1464 | 
            +
                          <script id="example" src="https://gist.github.com/a/example.js"></script>
         | 
| 1465 | 
            +
                        HTML
         | 
| 1466 | 
            +
                      end
         | 
| 1467 | 
            +
                    else
         | 
| 1468 | 
            +
                      it "forces async attribute on script" do
         | 
| 1469 | 
            +
                        should eq <<-HTML.strip_heredoc
         | 
| 1470 | 
            +
                          <script id="example" src="https://gist.github.com/a/example.js" async="async"></script>
         | 
| 1471 | 
            +
                        HTML
         | 
| 1472 | 
            +
                      end
         | 
| 1473 | 
            +
                    end
         | 
| 1474 | 
            +
                  end
         | 
| 1475 | 
            +
             | 
| 1476 | 
            +
                  context "with HTML embed code for Youtube" do
         | 
| 1477 | 
            +
                    let(:markdown) do
         | 
| 1478 | 
            +
                      <<-MARKDOWN.strip_heredoc
         | 
| 1479 | 
            +
                        <iframe width="100" height="100" src="https://www.youtube.com/embed/example"></iframe>
         | 
| 1480 | 
            +
                      MARKDOWN
         | 
| 1481 | 
            +
                    end
         | 
| 1482 | 
            +
             | 
| 1483 | 
            +
                    if allowed
         | 
| 1484 | 
            +
                      it "does not sanitize embed code" do
         | 
| 1485 | 
            +
                        should eq <<-HTML.strip_heredoc
         | 
| 1486 | 
            +
                          <iframe width="100" height="100" src="https://www.youtube.com/embed/example"></iframe>
         | 
| 1487 | 
            +
                        HTML
         | 
| 1488 | 
            +
                      end
         | 
| 1489 | 
            +
                    else
         | 
| 1490 | 
            +
                      it "forces width attribute on iframe" do
         | 
| 1491 | 
            +
                        should eq <<-HTML.strip_heredoc
         | 
| 1492 | 
            +
                          <iframe width="100%" height="100" src="https://www.youtube.com/embed/example"></iframe>
         | 
| 1493 | 
            +
                        HTML
         | 
| 1494 | 
            +
                      end
         | 
| 1495 | 
            +
                    end
         | 
| 1496 | 
            +
             | 
| 1497 | 
            +
                    context "when url is privacy enhanced mode" do
         | 
| 1498 | 
            +
                      let(:markdown) do
         | 
| 1499 | 
            +
                        <<-MARKDOWN.strip_heredoc
         | 
| 1500 | 
            +
                          <iframe width="100" height="100" src="https://www.youtube-nocookie.com/embed/example"></iframe>
         | 
| 1501 | 
            +
                        MARKDOWN
         | 
| 1502 | 
            +
                      end
         | 
| 1503 | 
            +
             | 
| 1504 | 
            +
                      if allowed
         | 
| 1505 | 
            +
                        it "does not sanitize embed code" do
         | 
| 1506 | 
            +
                          should eq <<-HTML.strip_heredoc
         | 
| 1507 | 
            +
                            <iframe width="100" height="100" src="https://www.youtube-nocookie.com/embed/example"></iframe>
         | 
| 1508 | 
            +
                          HTML
         | 
| 1509 | 
            +
                        end
         | 
| 1510 | 
            +
                      else
         | 
| 1511 | 
            +
                        it "forces width attribute on iframe" do
         | 
| 1512 | 
            +
                          should eq <<-HTML.strip_heredoc
         | 
| 1513 | 
            +
                            <iframe width="100%" height="100" src="https://www.youtube-nocookie.com/embed/example"></iframe>
         | 
| 1514 | 
            +
                          HTML
         | 
| 1515 | 
            +
                        end
         | 
| 1516 | 
            +
                      end
         | 
| 1517 | 
            +
                    end
         | 
| 1518 | 
            +
                  end
         | 
| 1519 | 
            +
             | 
| 1520 | 
            +
                  context "with HTML embed code for SlideShare" do
         | 
| 1521 | 
            +
                    let(:markdown) do
         | 
| 1522 | 
            +
                      <<-MARKDOWN.strip_heredoc
         | 
| 1523 | 
            +
                        <iframe width="100" height="100" src="https://www.slideshare.net/embed/example"></iframe>
         | 
| 1524 | 
            +
                      MARKDOWN
         | 
| 1525 | 
            +
                    end
         | 
| 1526 | 
            +
             | 
| 1527 | 
            +
                    if allowed
         | 
| 1528 | 
            +
                      it "does not sanitize embed code" do
         | 
| 1529 | 
            +
                        should eq <<-HTML.strip_heredoc
         | 
| 1530 | 
            +
                          <iframe width="100" height="100" src="https://www.slideshare.net/embed/example"></iframe>
         | 
| 1531 | 
            +
                        HTML
         | 
| 1532 | 
            +
                      end
         | 
| 1533 | 
            +
                    else
         | 
| 1534 | 
            +
                      it "forces width attribute on iframe" do
         | 
| 1535 | 
            +
                        should eq <<-HTML.strip_heredoc
         | 
| 1536 | 
            +
                          <iframe width="100%" height="100" src="https://www.slideshare.net/embed/example"></iframe>
         | 
| 1537 | 
            +
                        HTML
         | 
| 1538 | 
            +
                      end
         | 
| 1539 | 
            +
                    end
         | 
| 1540 | 
            +
                  end
         | 
| 1541 | 
            +
             | 
| 1542 | 
            +
                  context "with HTML embed code for GoogleSlide" do
         | 
| 1543 | 
            +
                    let(:markdown) do
         | 
| 1544 | 
            +
                      <<-MARKDOWN.strip_heredoc
         | 
| 1545 | 
            +
                        <iframe src="https://docs.google.com/presentation/d/example/embed" frameborder="0" width="482" height="300" allowfullscreen="true" mozallowfullscreen="true" webkitallowfullscreen="true"></iframe>
         | 
| 1546 | 
            +
                      MARKDOWN
         | 
| 1547 | 
            +
                    end
         | 
| 1548 | 
            +
             | 
| 1549 | 
            +
                    if allowed
         | 
| 1550 | 
            +
                      it "does not sanitize embed code" do
         | 
| 1551 | 
            +
                        should eq <<-HTML.strip_heredoc
         | 
| 1552 | 
            +
                          <iframe src="https://docs.google.com/presentation/d/example/embed" frameborder="0" width="482" height="300" allowfullscreen="true"></iframe>
         | 
| 1553 | 
            +
                        HTML
         | 
| 1554 | 
            +
                      end
         | 
| 1555 | 
            +
                    else
         | 
| 1556 | 
            +
                      it "forces width attribute on iframe" do
         | 
| 1557 | 
            +
                        should eq <<-HTML.strip_heredoc
         | 
| 1558 | 
            +
                          <iframe src="https://docs.google.com/presentation/d/example/embed" frameborder="0" width="100%" height="300" allowfullscreen="true"></iframe>
         | 
| 1559 | 
            +
                        HTML
         | 
| 1560 | 
            +
                      end
         | 
| 1561 | 
            +
                    end
         | 
| 1562 | 
            +
                  end
         | 
| 1563 | 
            +
             | 
| 1564 | 
            +
                  context "with HTML embed code for SpeekerDeck" do
         | 
| 1565 | 
            +
                    let(:markdown) do
         | 
| 1566 | 
            +
                      <<-MARKDOWN.strip_heredoc
         | 
| 1567 | 
            +
                        <script async class="speakerdeck-embed" data-id="example" data-ratio="1.33333333333333" src="//speakerdeck.com/assets/embed.js"></script>
         | 
| 1568 | 
            +
                      MARKDOWN
         | 
| 1569 | 
            +
                    end
         | 
| 1570 | 
            +
             | 
| 1571 | 
            +
                    if allowed
         | 
| 1572 | 
            +
                      it "does not sanitize embed code" do
         | 
| 1573 | 
            +
                        should eq <<-HTML.strip_heredoc
         | 
| 1574 | 
            +
                          <script async class="speakerdeck-embed" data-id="example" data-ratio="1.33333333333333" src="//speakerdeck.com/assets/embed.js"></script>
         | 
| 1575 | 
            +
                        HTML
         | 
| 1576 | 
            +
                      end
         | 
| 1577 | 
            +
                    else
         | 
| 1578 | 
            +
                      it "forces async attribute on script" do
         | 
| 1579 | 
            +
                        should eq <<-HTML.strip_heredoc
         | 
| 1580 | 
            +
                          <script async class="speakerdeck-embed" data-id="example" data-ratio="1.33333333333333" src="//speakerdeck.com/assets/embed.js"></script>
         | 
| 1581 | 
            +
                        HTML
         | 
| 1582 | 
            +
                      end
         | 
| 1583 | 
            +
                    end
         | 
| 1584 | 
            +
                  end
         | 
| 1585 | 
            +
             | 
| 1410 1586 | 
             
                  context "with embed code for Tweet" do
         | 
| 1411 1587 | 
             
                    let(:markdown) do
         | 
| 1412 1588 | 
             
                      <<-MARKDOWN.strip_heredoc
         | 
| @@ -1422,6 +1598,34 @@ describe Qiita::Markdown::Processor do | |
| 1422 1598 | 
             
                      HTML
         | 
| 1423 1599 | 
             
                    end
         | 
| 1424 1600 | 
             
                  end
         | 
| 1601 | 
            +
             | 
| 1602 | 
            +
                  context "with embed script code with xss" do
         | 
| 1603 | 
            +
                    let(:markdown) do
         | 
| 1604 | 
            +
                      <<-MARKDOWN.strip_heredoc
         | 
| 1605 | 
            +
                        <script async class="speakerdeck-embed" data-id="example" data-ratio="1.33333333333333" src="javascript://speakerdeck.com/assets/embed.js"></script>
         | 
| 1606 | 
            +
                      MARKDOWN
         | 
| 1607 | 
            +
             | 
| 1608 | 
            +
                      it "forces width attribute on iframe" do
         | 
| 1609 | 
            +
                        should eq <<-HTML.strip_heredoc
         | 
| 1610 | 
            +
                          \n
         | 
| 1611 | 
            +
                        HTML
         | 
| 1612 | 
            +
                      end
         | 
| 1613 | 
            +
                    end
         | 
| 1614 | 
            +
                  end
         | 
| 1615 | 
            +
             | 
| 1616 | 
            +
                  context "with embed iframe code with xss" do
         | 
| 1617 | 
            +
                    let(:markdown) do
         | 
| 1618 | 
            +
                      <<-MARKDOWN.strip_heredoc
         | 
| 1619 | 
            +
                        <iframe src="javascript://docs.google.com/presentation/d/example/embed" frameborder="0" width="482" height="300" allowfullscreen="true" mozallowfullscreen="true" webkitallowfullscreen="true"></iframe>
         | 
| 1620 | 
            +
                      MARKDOWN
         | 
| 1621 | 
            +
             | 
| 1622 | 
            +
                      it "forces width attribute on iframe" do
         | 
| 1623 | 
            +
                        should eq <<-HTML.strip_heredoc
         | 
| 1624 | 
            +
                          \n
         | 
| 1625 | 
            +
                        HTML
         | 
| 1626 | 
            +
                      end
         | 
| 1627 | 
            +
                    end
         | 
| 1628 | 
            +
                  end
         | 
| 1425 1629 | 
             
                end
         | 
| 1426 1630 |  | 
| 1427 1631 | 
             
                context "without script and strict context" do
         | 
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: qiita-markdown
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0. | 
| 4 | 
            +
              version: 0.32.0
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Ryo Nakamura
         | 
| 8 | 
            -
            autorequire: | 
| 8 | 
            +
            autorequire:
         | 
| 9 9 | 
             
            bindir: bin
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date:  | 
| 11 | 
            +
            date: 2021-03-15 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: gemoji
         | 
| @@ -86,14 +86,14 @@ dependencies: | |
| 86 86 | 
             
                requirements:
         | 
| 87 87 | 
             
                - - '='
         | 
| 88 88 | 
             
                  - !ruby/object:Gem::Version
         | 
| 89 | 
            -
                    version: 3. | 
| 89 | 
            +
                    version: 3.5.1.1
         | 
| 90 90 | 
             
              type: :runtime
         | 
| 91 91 | 
             
              prerelease: false
         | 
| 92 92 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 93 93 | 
             
                requirements:
         | 
| 94 94 | 
             
                - - '='
         | 
| 95 95 | 
             
                  - !ruby/object:Gem::Version
         | 
| 96 | 
            -
                    version: 3. | 
| 96 | 
            +
                    version: 3.5.1.1
         | 
| 97 97 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 98 98 | 
             
              name: sanitize
         | 
| 99 99 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| @@ -234,7 +234,7 @@ dependencies: | |
| 234 234 | 
             
                - - '='
         | 
| 235 235 | 
             
                  - !ruby/object:Gem::Version
         | 
| 236 236 | 
             
                    version: 0.49.1
         | 
| 237 | 
            -
            description: | 
| 237 | 
            +
            description:
         | 
| 238 238 | 
             
            email:
         | 
| 239 239 | 
             
            - r7kamura@gmail.com
         | 
| 240 240 | 
             
            executables: []
         | 
| @@ -258,7 +258,12 @@ files: | |
| 258 258 | 
             
            - lib/qiita/markdown/base_processor.rb
         | 
| 259 259 | 
             
            - lib/qiita/markdown/embed/asciinema.rb
         | 
| 260 260 | 
             
            - lib/qiita/markdown/embed/code_pen.rb
         | 
| 261 | 
            +
            - lib/qiita/markdown/embed/gist.rb
         | 
| 262 | 
            +
            - lib/qiita/markdown/embed/google_slide.rb
         | 
| 263 | 
            +
            - lib/qiita/markdown/embed/slide_share.rb
         | 
| 264 | 
            +
            - lib/qiita/markdown/embed/speeker_deck.rb
         | 
| 261 265 | 
             
            - lib/qiita/markdown/embed/tweet.rb
         | 
| 266 | 
            +
            - lib/qiita/markdown/embed/youtube.rb
         | 
| 262 267 | 
             
            - lib/qiita/markdown/filters/checkbox.rb
         | 
| 263 268 | 
             
            - lib/qiita/markdown/filters/code_block.rb
         | 
| 264 269 | 
             
            - lib/qiita/markdown/filters/emoji.rb
         | 
| @@ -281,6 +286,7 @@ files: | |
| 281 286 | 
             
            - lib/qiita/markdown/processor.rb
         | 
| 282 287 | 
             
            - lib/qiita/markdown/summary_processor.rb
         | 
| 283 288 | 
             
            - lib/qiita/markdown/transformers/filter_attributes.rb
         | 
| 289 | 
            +
            - lib/qiita/markdown/transformers/filter_iframe.rb
         | 
| 284 290 | 
             
            - lib/qiita/markdown/transformers/filter_script.rb
         | 
| 285 291 | 
             
            - lib/qiita/markdown/transformers/strip_invalid_node.rb
         | 
| 286 292 | 
             
            - lib/qiita/markdown/version.rb
         | 
| @@ -295,7 +301,7 @@ homepage: https://github.com/increments/qiita-markdown | |
| 295 301 | 
             
            licenses:
         | 
| 296 302 | 
             
            - MIT
         | 
| 297 303 | 
             
            metadata: {}
         | 
| 298 | 
            -
            post_install_message: | 
| 304 | 
            +
            post_install_message:
         | 
| 299 305 | 
             
            rdoc_options: []
         | 
| 300 306 | 
             
            require_paths:
         | 
| 301 307 | 
             
            - lib
         | 
| @@ -310,9 +316,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement | |
| 310 316 | 
             
                - !ruby/object:Gem::Version
         | 
| 311 317 | 
             
                  version: '0'
         | 
| 312 318 | 
             
            requirements: []
         | 
| 313 | 
            -
             | 
| 314 | 
            -
             | 
| 315 | 
            -
            signing_key: 
         | 
| 319 | 
            +
            rubygems_version: 3.0.3
         | 
| 320 | 
            +
            signing_key:
         | 
| 316 321 | 
             
            specification_version: 4
         | 
| 317 322 | 
             
            summary: Qiita-specified markdown processor.
         | 
| 318 323 | 
             
            test_files:
         |