qiita-markdown 0.29.0 → 0.34.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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +21 -0
- data/lib/qiita/markdown.rb +0 -1
- data/lib/qiita/markdown/transformers/filter_iframe.rb +6 -2
- data/lib/qiita/markdown/transformers/filter_script.rb +5 -3
- data/lib/qiita/markdown/version.rb +1 -1
- data/qiita-markdown.gemspec +1 -1
- data/spec/qiita/markdown/processor_spec.rb +114 -32
- metadata +4 -5
- data/lib/qiita/markdown/embed/gist.rb +0 -9
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 930ee5ee8bc770b95b918f3cfed4fdac57f133e9e69d0b21fff77cd2506a8fdc
|
4
|
+
data.tar.gz: 87f95cb871e08f94e1e03dd11a14ddd974ee24726b78ae3496bd3629e3b76959
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0ac7943de01ab9b05c990f6ec8abe64d37c780b186da66b30017129f014d7944aa60e437a9466033b2c801dd701fdf6564d30451bc2ece1d6551011ff44d814b
|
7
|
+
data.tar.gz: cb8bd175dcd7aec1685209eca0c51c396a80d686737267155d1815d98546f65d7fa5927cf525cb109ed777a5a92835239f59d46e70f246e8ddb1bd9b8f7ebac5
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,26 @@
|
|
1
1
|
## Unreleased
|
2
2
|
|
3
|
+
## 0.34.0
|
4
|
+
|
5
|
+
- Delete gist embed rule to avoid XSS
|
6
|
+
|
7
|
+
## 0.33.0
|
8
|
+
|
9
|
+
- Fix XSS possibility bug
|
10
|
+
|
11
|
+
## 0.32.0
|
12
|
+
|
13
|
+
- Fix XSS possibility bug
|
14
|
+
- Fix iframe width to be fixed at 100%
|
15
|
+
|
16
|
+
## 0.31.0
|
17
|
+
|
18
|
+
- Use greenmat 3.5.1.1
|
19
|
+
|
20
|
+
## 0.30.0
|
21
|
+
|
22
|
+
- Use greenmat 3.5.1.0
|
23
|
+
|
3
24
|
## 0.29.0
|
4
25
|
|
5
26
|
- Accept new embeded script and iframes
|
data/lib/qiita/markdown.rb
CHANGED
@@ -10,7 +10,6 @@ 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
13
|
require "qiita/markdown/embed/youtube"
|
15
14
|
require "qiita/markdown/embed/slide_share"
|
16
15
|
require "qiita/markdown/embed/google_slide"
|
@@ -22,6 +22,7 @@ module Qiita
|
|
22
22
|
def transform
|
23
23
|
if name == "iframe"
|
24
24
|
if URL_WHITE_LIST.include?(node["src"]) || HOST_WHITE_LIST.include?(host_of(node["src"]))
|
25
|
+
node["width"] = "100%"
|
25
26
|
node.children.unlink
|
26
27
|
else
|
27
28
|
node.unlink
|
@@ -40,8 +41,11 @@ module Qiita
|
|
40
41
|
end
|
41
42
|
|
42
43
|
def host_of(url)
|
43
|
-
|
44
|
-
|
44
|
+
if url
|
45
|
+
scheme = URI.parse(url).scheme
|
46
|
+
Addressable::URI.parse(url).host if ["http", "https"].include? scheme
|
47
|
+
end
|
48
|
+
rescue Addressable::URI::InvalidURIError, URI::InvalidURIError
|
45
49
|
nil
|
46
50
|
end
|
47
51
|
end
|
@@ -10,7 +10,6 @@ module Qiita
|
|
10
10
|
|
11
11
|
HOST_WHITE_LIST = [
|
12
12
|
Embed::Asciinema::SCRIPT_HOST,
|
13
|
-
Embed::Gist::SCRIPT_HOST,
|
14
13
|
].flatten.freeze
|
15
14
|
|
16
15
|
def self.call(*args)
|
@@ -43,8 +42,11 @@ module Qiita
|
|
43
42
|
end
|
44
43
|
|
45
44
|
def host_of(url)
|
46
|
-
|
47
|
-
|
45
|
+
if url
|
46
|
+
scheme = URI.parse(url).scheme
|
47
|
+
Addressable::URI.parse(url).host if ["http", "https"].include? scheme
|
48
|
+
end
|
49
|
+
rescue Addressable::URI::InvalidURIError, URI::InvalidURIError
|
48
50
|
nil
|
49
51
|
end
|
50
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,40 +1451,26 @@ describe Qiita::Markdown::Processor do
|
|
1407
1451
|
end
|
1408
1452
|
end
|
1409
1453
|
|
1410
|
-
context "with HTML embed code for
|
1454
|
+
context "with HTML embed code for Youtube" do
|
1411
1455
|
let(:markdown) do
|
1412
1456
|
<<-MARKDOWN.strip_heredoc
|
1413
|
-
<
|
1457
|
+
<iframe width="100" height="100" src="https://www.youtube.com/embed/example"></iframe>
|
1414
1458
|
MARKDOWN
|
1415
1459
|
end
|
1416
1460
|
|
1417
1461
|
if allowed
|
1418
1462
|
it "does not sanitize embed code" do
|
1419
1463
|
should eq <<-HTML.strip_heredoc
|
1420
|
-
<
|
1464
|
+
<iframe width="100" height="100" src="https://www.youtube.com/embed/example"></iframe>
|
1421
1465
|
HTML
|
1422
1466
|
end
|
1423
1467
|
else
|
1424
|
-
it "forces
|
1468
|
+
it "forces width attribute on iframe" do
|
1425
1469
|
should eq <<-HTML.strip_heredoc
|
1426
|
-
<
|
1470
|
+
<iframe width="100%" height="100" src="https://www.youtube.com/embed/example"></iframe>
|
1427
1471
|
HTML
|
1428
1472
|
end
|
1429
1473
|
end
|
1430
|
-
end
|
1431
|
-
|
1432
|
-
context "with HTML embed code for Youtube" do
|
1433
|
-
let(:markdown) do
|
1434
|
-
<<-MARKDOWN.strip_heredoc
|
1435
|
-
<iframe width="100" height="100" src="https://www.youtube.com/embed/example"></iframe>
|
1436
|
-
MARKDOWN
|
1437
|
-
end
|
1438
|
-
|
1439
|
-
it "does not sanitize embed code" do
|
1440
|
-
should eq <<-HTML.strip_heredoc
|
1441
|
-
<iframe width="100" height="100" src="https://www.youtube.com/embed/example"></iframe>
|
1442
|
-
HTML
|
1443
|
-
end
|
1444
1474
|
|
1445
1475
|
context "when url is privacy enhanced mode" do
|
1446
1476
|
let(:markdown) do
|
@@ -1449,10 +1479,18 @@ describe Qiita::Markdown::Processor do
|
|
1449
1479
|
MARKDOWN
|
1450
1480
|
end
|
1451
1481
|
|
1452
|
-
|
1453
|
-
|
1454
|
-
|
1455
|
-
|
1482
|
+
if allowed
|
1483
|
+
it "does not sanitize embed code" do
|
1484
|
+
should eq <<-HTML.strip_heredoc
|
1485
|
+
<iframe width="100" height="100" src="https://www.youtube-nocookie.com/embed/example"></iframe>
|
1486
|
+
HTML
|
1487
|
+
end
|
1488
|
+
else
|
1489
|
+
it "forces width attribute on iframe" do
|
1490
|
+
should eq <<-HTML.strip_heredoc
|
1491
|
+
<iframe width="100%" height="100" src="https://www.youtube-nocookie.com/embed/example"></iframe>
|
1492
|
+
HTML
|
1493
|
+
end
|
1456
1494
|
end
|
1457
1495
|
end
|
1458
1496
|
end
|
@@ -1464,10 +1502,18 @@ describe Qiita::Markdown::Processor do
|
|
1464
1502
|
MARKDOWN
|
1465
1503
|
end
|
1466
1504
|
|
1467
|
-
|
1468
|
-
|
1469
|
-
|
1470
|
-
|
1505
|
+
if allowed
|
1506
|
+
it "does not sanitize embed code" do
|
1507
|
+
should eq <<-HTML.strip_heredoc
|
1508
|
+
<iframe width="100" height="100" src="https://www.slideshare.net/embed/example"></iframe>
|
1509
|
+
HTML
|
1510
|
+
end
|
1511
|
+
else
|
1512
|
+
it "forces width attribute on iframe" do
|
1513
|
+
should eq <<-HTML.strip_heredoc
|
1514
|
+
<iframe width="100%" height="100" src="https://www.slideshare.net/embed/example"></iframe>
|
1515
|
+
HTML
|
1516
|
+
end
|
1471
1517
|
end
|
1472
1518
|
end
|
1473
1519
|
|
@@ -1478,10 +1524,18 @@ describe Qiita::Markdown::Processor do
|
|
1478
1524
|
MARKDOWN
|
1479
1525
|
end
|
1480
1526
|
|
1481
|
-
|
1482
|
-
|
1483
|
-
|
1484
|
-
|
1527
|
+
if allowed
|
1528
|
+
it "does not sanitize embed code" do
|
1529
|
+
should eq <<-HTML.strip_heredoc
|
1530
|
+
<iframe src="https://docs.google.com/presentation/d/example/embed" frameborder="0" width="482" height="300" allowfullscreen="true"></iframe>
|
1531
|
+
HTML
|
1532
|
+
end
|
1533
|
+
else
|
1534
|
+
it "forces width attribute on iframe" do
|
1535
|
+
should eq <<-HTML.strip_heredoc
|
1536
|
+
<iframe src="https://docs.google.com/presentation/d/example/embed" frameborder="0" width="100%" height="300" allowfullscreen="true"></iframe>
|
1537
|
+
HTML
|
1538
|
+
end
|
1485
1539
|
end
|
1486
1540
|
end
|
1487
1541
|
|
@@ -1522,6 +1576,34 @@ describe Qiita::Markdown::Processor do
|
|
1522
1576
|
HTML
|
1523
1577
|
end
|
1524
1578
|
end
|
1579
|
+
|
1580
|
+
context "with embed script code with xss" do
|
1581
|
+
let(:markdown) do
|
1582
|
+
<<-MARKDOWN.strip_heredoc
|
1583
|
+
<script async class="speakerdeck-embed" data-id="example" data-ratio="1.33333333333333" src="javascript://speakerdeck.com/assets/embed.js"></script>
|
1584
|
+
MARKDOWN
|
1585
|
+
|
1586
|
+
it "forces width attribute on iframe" do
|
1587
|
+
should eq <<-HTML.strip_heredoc
|
1588
|
+
\n
|
1589
|
+
HTML
|
1590
|
+
end
|
1591
|
+
end
|
1592
|
+
end
|
1593
|
+
|
1594
|
+
context "with embed iframe code with xss" do
|
1595
|
+
let(:markdown) do
|
1596
|
+
<<-MARKDOWN.strip_heredoc
|
1597
|
+
<iframe src="javascript://docs.google.com:80/%0d%0aalert(document.domain)" frameborder="0" width="482" height="300" allowfullscreen="true" mozallowfullscreen="true" webkitallowfullscreen="true"></iframe>
|
1598
|
+
MARKDOWN
|
1599
|
+
|
1600
|
+
it "forces width attribute on iframe" do
|
1601
|
+
should eq <<-HTML.strip_heredoc
|
1602
|
+
\n
|
1603
|
+
HTML
|
1604
|
+
end
|
1605
|
+
end
|
1606
|
+
end
|
1525
1607
|
end
|
1526
1608
|
|
1527
1609
|
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.34.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ryo Nakamura
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-
|
11
|
+
date: 2021-03-19 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
|
@@ -258,7 +258,6 @@ 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
261
|
- lib/qiita/markdown/embed/google_slide.rb
|
263
262
|
- lib/qiita/markdown/embed/slide_share.rb
|
264
263
|
- lib/qiita/markdown/embed/speeker_deck.rb
|