webmention-verification 0.1.2 → 1.0.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/.editorconfig +1 -1
- data/.reek.yml +11 -0
- data/.rubocop.yml +7 -1
- data/.ruby-version +1 -1
- data/.travis.yml +5 -7
- data/CHANGELOG.md +13 -0
- data/CONTRIBUTING.md +2 -2
- data/LICENSE +1 -1
- data/README.md +2 -2
- data/Rakefile +6 -1
- data/lib/webmention/verification.rb +4 -2
- data/lib/webmention/verification/client.rb +13 -18
- data/lib/webmention/verification/{error.rb → exceptions.rb} +0 -0
- data/lib/webmention/verification/registerable.rb +13 -0
- data/lib/webmention/verification/verifiers.rb +44 -0
- data/lib/webmention/verification/verifiers/html_verifier.rb +29 -33
- data/lib/webmention/verification/verifiers/json_verifier.rb +37 -21
- data/lib/webmention/verification/verifiers/plaintext_verifier.rb +14 -10
- data/lib/webmention/verification/version.rb +1 -1
- data/webmention-verification.gemspec +8 -7
- metadata +39 -23
- data/lib/webmention/verification/verifier.rb +0 -58
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 2132738467e12670eb219ec7c13dd036ecf6f66c1ac9d140dbc2ae5c923bab8e
|
|
4
|
+
data.tar.gz: 6c7ae3453d6d6f49d636232da018296b79653742e006fae38759d25ab97ff7d8
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 1c179c019d4ef0f934c80971f8c025389cab04f3e4bd1f53989e596e82b426049ed02e63f7a98cd643c55be76ba31d8c29e3170f26783c308048c27332a07429
|
|
7
|
+
data.tar.gz: bd29c4d92f5906acbca29055c1aa68f4e122dc7766046acbe31b457932baf2aa8e4d8a47cf6dd58207ed7d508224e42f464c3ef2da541be104a113aa0dcc1e29
|
data/.editorconfig
CHANGED
data/.reek.yml
ADDED
data/.rubocop.yml
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
require:
|
|
2
|
+
- rubocop-performance
|
|
2
3
|
- rubocop-rspec
|
|
3
4
|
|
|
4
5
|
Layout/AlignHash:
|
|
5
6
|
EnforcedColonStyle: table
|
|
6
|
-
EnforcedLastArgumentHashStyle: ignore_implicit
|
|
7
7
|
|
|
8
8
|
Metrics/BlockLength:
|
|
9
9
|
Exclude:
|
|
@@ -12,6 +12,9 @@ Metrics/BlockLength:
|
|
|
12
12
|
Metrics/LineLength:
|
|
13
13
|
Enabled: false
|
|
14
14
|
|
|
15
|
+
Naming/RescuedExceptionsVariableName:
|
|
16
|
+
PreferredName: exception
|
|
17
|
+
|
|
15
18
|
RSpec/NestedGroups:
|
|
16
19
|
Max: 4
|
|
17
20
|
|
|
@@ -20,3 +23,6 @@ Style/Documentation:
|
|
|
20
23
|
|
|
21
24
|
Style/FrozenStringLiteralComment:
|
|
22
25
|
Enabled: false
|
|
26
|
+
|
|
27
|
+
Style/SymbolArray:
|
|
28
|
+
Enabled: false
|
data/.ruby-version
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
2.4.
|
|
1
|
+
2.4.6
|
data/.travis.yml
CHANGED
|
@@ -1,19 +1,17 @@
|
|
|
1
1
|
language: ruby
|
|
2
2
|
rvm:
|
|
3
|
-
- 2.4.
|
|
4
|
-
- 2.5.
|
|
5
|
-
- 2.6.
|
|
3
|
+
- 2.4.6
|
|
4
|
+
- 2.5.5
|
|
5
|
+
- 2.6.2
|
|
6
6
|
cache:
|
|
7
7
|
- bundler
|
|
8
8
|
before_install:
|
|
9
|
-
- gem
|
|
9
|
+
- gem update --system
|
|
10
|
+
- gem install bundler
|
|
10
11
|
before_script:
|
|
11
12
|
- curl -L https://codeclimate.com/downloads/test-reporter/test-reporter-latest-linux-amd64 > ./cc-test-reporter
|
|
12
13
|
- chmod +x ./cc-test-reporter
|
|
13
14
|
- ./cc-test-reporter before-build
|
|
14
|
-
script:
|
|
15
|
-
- bundle exec rubocop
|
|
16
|
-
- bundle exec rake
|
|
17
15
|
after_script:
|
|
18
16
|
- ./cc-test-reporter after-build --exit-code $TRAVIS_TEST_RESULT
|
|
19
17
|
notifications:
|
data/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,18 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 1.0.0 / 2019-04-25
|
|
4
|
+
|
|
5
|
+
- Use pre-release HTTP gem (see @httprb/http#489) ([bdcfdad](https://github.com/jgarber623/webmention-verification-ruby/commit/bdcfdad)).
|
|
6
|
+
- Refactor verifiers:
|
|
7
|
+
- ([7eef7bd](https://github.com/jgarber623/webmention-verification-ruby/commit/7eef7bd))
|
|
8
|
+
- ([55eb17e](https://github.com/jgarber623/webmention-verification-ruby/commit/55eb17e))
|
|
9
|
+
- ([bcdf3b4](https://github.com/jgarber623/webmention-verification-ruby/commit/bcdf3b4))
|
|
10
|
+
- Refactor `Client#response` exception handling ([29afcb0](https://github.com/jgarber623/webmention-verification-ruby/commit/29afcb0)).
|
|
11
|
+
- Rename `errors` to `exceptions` ([2bca96b](https://github.com/jgarber623/webmention-verification-ruby/commit/2bca96b)).
|
|
12
|
+
- Spec cleanup:
|
|
13
|
+
- ([4b84f16](https://github.com/jgarber623/webmention-verification-ruby/commit/4b84f16))
|
|
14
|
+
- ([4940e9c](https://github.com/jgarber623/webmention-verification-ruby/commit/4940e9c))
|
|
15
|
+
|
|
3
16
|
## 0.1.2 / 2019-01-03
|
|
4
17
|
|
|
5
18
|
- Expand supported Ruby versions to include 2.6 ([1d61fea](https://github.com/jgarber623/webmention-verification-ruby/commit/1d61fea)).
|
data/CONTRIBUTING.md
CHANGED
|
@@ -8,9 +8,9 @@ There are a couple ways you can help improve webmention-verification-ruby:
|
|
|
8
8
|
|
|
9
9
|
## Getting Started
|
|
10
10
|
|
|
11
|
-
webmention-verification-ruby is developed using Ruby 2.4.
|
|
11
|
+
webmention-verification-ruby is developed using Ruby 2.4.6 and is additionally tested against Ruby 2.5.5 and 2.6.2 using [Travis CI](https://travis-ci.com/jgarber623/webmention-verification-ruby).
|
|
12
12
|
|
|
13
|
-
Before making changes to webmention-verification-ruby, you'll want to install Ruby 2.4.
|
|
13
|
+
Before making changes to webmention-verification-ruby, you'll want to install Ruby 2.4.6. It's recommended that you use a Ruby version managment tool like [rbenv](https://github.com/rbenv/rbenv), [chruby](https://github.com/postmodern/chruby), or [rvm](https://github.com/rvm/rvm). Once you've installed Ruby 2.4.6 using your method of choice, install the project's gems by running:
|
|
14
14
|
|
|
15
15
|
```sh
|
|
16
16
|
bundle install
|
data/LICENSE
CHANGED
data/README.md
CHANGED
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
|
|
19
19
|
Before installing and using webmention-verification-ruby, you'll want to have [Ruby](https://www.ruby-lang.org) 2.4 (or newer) installed. It's recommended that you use a Ruby version managment tool like [rbenv](https://github.com/rbenv/rbenv), [chruby](https://github.com/postmodern/chruby), or [rvm](https://github.com/rvm/rvm).
|
|
20
20
|
|
|
21
|
-
webmention-verification-ruby is developed using Ruby 2.4.
|
|
21
|
+
webmention-verification-ruby is developed using Ruby 2.4.6 and is additionally tested against Ruby 2.5.5 and 2.6.2 using [Travis CI](https://travis-ci.com/jgarber623/webmention-verification-ruby).
|
|
22
22
|
|
|
23
23
|
## Installation
|
|
24
24
|
|
|
@@ -129,7 +129,7 @@ require 'webmention/verification'
|
|
|
129
129
|
response = HTTP.get('https://source.example.com/post/100')
|
|
130
130
|
target = 'https://target.example.com/post/100'
|
|
131
131
|
|
|
132
|
-
verifier = Webmention::Verification::HtmlVerifier.new(response, target)
|
|
132
|
+
verifier = Webmention::Verification::Verifiers::HtmlVerifier.new(response, target)
|
|
133
133
|
|
|
134
134
|
verifier.verified? # returns Boolean
|
|
135
135
|
verifier.results # returns Array
|
data/Rakefile
CHANGED
|
@@ -1,6 +1,11 @@
|
|
|
1
1
|
require 'bundler/gem_tasks'
|
|
2
|
+
|
|
3
|
+
require 'reek/rake/task'
|
|
2
4
|
require 'rspec/core/rake_task'
|
|
5
|
+
require 'rubocop/rake_task'
|
|
3
6
|
|
|
7
|
+
Reek::Rake::Task.new
|
|
4
8
|
RSpec::Core::RakeTask.new
|
|
9
|
+
RuboCop::RakeTask.new
|
|
5
10
|
|
|
6
|
-
task default: :spec
|
|
11
|
+
task default: [:rubocop, :reek, :spec]
|
|
@@ -4,10 +4,12 @@ require 'json'
|
|
|
4
4
|
require 'nokogiri'
|
|
5
5
|
|
|
6
6
|
require 'webmention/verification/version'
|
|
7
|
-
require 'webmention/verification/
|
|
7
|
+
require 'webmention/verification/exceptions'
|
|
8
|
+
|
|
8
9
|
require 'webmention/verification/client'
|
|
9
|
-
require 'webmention/verification/
|
|
10
|
+
require 'webmention/verification/registerable'
|
|
10
11
|
|
|
12
|
+
require 'webmention/verification/verifiers'
|
|
11
13
|
require 'webmention/verification/verifiers/html_verifier'
|
|
12
14
|
require 'webmention/verification/verifiers/json_verifier'
|
|
13
15
|
require 'webmention/verification/verifiers/plaintext_verifier'
|
|
@@ -8,53 +8,48 @@ module Webmention
|
|
|
8
8
|
|
|
9
9
|
attr_reader :source, :target
|
|
10
10
|
|
|
11
|
-
def initialize(source, target,
|
|
11
|
+
def initialize(source, target, **options)
|
|
12
12
|
raise ArgumentError, "source must be a String (given #{source.class.name})" unless source.is_a?(String)
|
|
13
13
|
raise ArgumentError, "target must be a String (given #{target.class.name})" unless target.is_a?(String)
|
|
14
14
|
|
|
15
15
|
@source = source
|
|
16
16
|
@target = target
|
|
17
|
-
@
|
|
17
|
+
@options = options
|
|
18
18
|
|
|
19
19
|
raise ArgumentError, 'source must be an absolute URI (e.g. https://example.com/post/100)' unless source_uri.absolute?
|
|
20
20
|
raise ArgumentError, 'target must be an absolute URI (e.g. https://example.com/post/100)' unless target_uri.absolute?
|
|
21
21
|
end
|
|
22
22
|
|
|
23
23
|
def response
|
|
24
|
-
@response ||= HTTP.follow.headers(HTTP_HEADERS_OPTS).timeout(
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
raise ConnectionError, error
|
|
30
|
-
rescue HTTP::TimeoutError => error
|
|
31
|
-
raise TimeoutError, error
|
|
32
|
-
rescue HTTP::Redirector::TooManyRedirectsError => error
|
|
33
|
-
raise TooManyRedirectsError, error
|
|
24
|
+
@response ||= HTTP.follow.headers(HTTP_HEADERS_OPTS).timeout(connect: 10, read: 10).get(source_uri)
|
|
25
|
+
rescue HTTP::ConnectionError,
|
|
26
|
+
HTTP::TimeoutError,
|
|
27
|
+
HTTP::Redirector::TooManyRedirectsError => exception
|
|
28
|
+
raise Webmention::Verification.const_get(exception.class.name.split('::').last), exception
|
|
34
29
|
end
|
|
35
30
|
|
|
36
31
|
def source_uri
|
|
37
32
|
@source_uri ||= Addressable::URI.parse(source)
|
|
38
|
-
rescue Addressable::URI::InvalidURIError =>
|
|
39
|
-
raise InvalidURIError,
|
|
33
|
+
rescue Addressable::URI::InvalidURIError => exception
|
|
34
|
+
raise InvalidURIError, exception
|
|
40
35
|
end
|
|
41
36
|
|
|
42
37
|
def target_uri
|
|
43
38
|
@target_uri ||= Addressable::URI.parse(target)
|
|
44
|
-
rescue Addressable::URI::InvalidURIError =>
|
|
45
|
-
raise InvalidURIError,
|
|
39
|
+
rescue Addressable::URI::InvalidURIError => exception
|
|
40
|
+
raise InvalidURIError, exception
|
|
46
41
|
end
|
|
47
42
|
|
|
48
43
|
def verified?
|
|
49
44
|
raise UnsupportedMimeTypeError, "Unsupported MIME Type: #{response.mime_type}" unless verifier_for_mime_type
|
|
50
45
|
|
|
51
|
-
verifier_for_mime_type.new(response, target,
|
|
46
|
+
verifier_for_mime_type.new(response, target, @options).verified?
|
|
52
47
|
end
|
|
53
48
|
|
|
54
49
|
private
|
|
55
50
|
|
|
56
51
|
def verifier_for_mime_type
|
|
57
|
-
@verifier_for_mime_type ||=
|
|
52
|
+
@verifier_for_mime_type ||= Verifiers.registered[response.mime_type]
|
|
58
53
|
end
|
|
59
54
|
end
|
|
60
55
|
end
|
|
File without changes
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
module Webmention
|
|
2
|
+
module Verification
|
|
3
|
+
module Verifiers
|
|
4
|
+
extend Registerable
|
|
5
|
+
|
|
6
|
+
class BaseVerifier
|
|
7
|
+
def initialize(response, target, **options)
|
|
8
|
+
raise ArgumentError, "response must be an HTTP::Response (given #{response.class.name})" unless response.is_a?(HTTP::Response)
|
|
9
|
+
raise ArgumentError, "target must be a String (given #{target.class.name})" unless target.is_a?(String)
|
|
10
|
+
|
|
11
|
+
@response = response
|
|
12
|
+
@target = target
|
|
13
|
+
@options = options
|
|
14
|
+
|
|
15
|
+
raise UnsupportedMimeTypeError, "Unsupported MIME Type: #{response.mime_type}" unless self.class.mime_types.include?(response.mime_type)
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def results
|
|
19
|
+
@results ||= parse_response_body
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def verified?
|
|
23
|
+
results.any?
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
private
|
|
27
|
+
|
|
28
|
+
def response_body
|
|
29
|
+
@response_body ||= @response.body.to_s
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def target_regexp
|
|
33
|
+
@target_regexp ||= /^#{target_regexp_str}$/
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def target_regexp_str
|
|
37
|
+
return @target if @options.fetch(:strict, true)
|
|
38
|
+
|
|
39
|
+
@target.sub(%r{https?://}, 'https?://')
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
@@ -1,47 +1,43 @@
|
|
|
1
1
|
module Webmention
|
|
2
2
|
module Verification
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
poster: %w[video],
|
|
9
|
-
src: %w[audio embed img source track video],
|
|
10
|
-
srcset: %w[img source]
|
|
11
|
-
}.freeze
|
|
12
|
-
|
|
13
|
-
def self.mime_types
|
|
14
|
-
['text/html']
|
|
15
|
-
end
|
|
3
|
+
module Verifiers
|
|
4
|
+
class HtmlVerifier < BaseVerifier
|
|
5
|
+
def self.mime_types
|
|
6
|
+
['text/html']
|
|
7
|
+
end
|
|
16
8
|
|
|
17
|
-
|
|
9
|
+
Verifiers.register(self)
|
|
18
10
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
11
|
+
HTML_ATTRIBUTE_MAP = {
|
|
12
|
+
cite: %w[blockquote del ins q],
|
|
13
|
+
data: %w[object],
|
|
14
|
+
href: %w[a area],
|
|
15
|
+
poster: %w[video],
|
|
16
|
+
src: %w[audio embed img source track video],
|
|
17
|
+
srcset: %w[img source]
|
|
18
|
+
}.freeze
|
|
22
19
|
|
|
23
|
-
|
|
24
|
-
matches = []
|
|
20
|
+
private
|
|
25
21
|
|
|
26
|
-
|
|
27
|
-
|
|
22
|
+
def doc
|
|
23
|
+
@doc ||= Nokogiri::HTML(response_body)
|
|
28
24
|
end
|
|
29
25
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
def search_doc(element, attribute)
|
|
34
|
-
regexp = attribute == :srcset ? srcset_attribute_regexp : target_regexp
|
|
26
|
+
def parse_response_body
|
|
27
|
+
HTML_ATTRIBUTE_MAP.each_with_object([]) { |(*args), matches| matches << search_doc(*args) }.flatten
|
|
28
|
+
end
|
|
35
29
|
|
|
36
|
-
|
|
37
|
-
|
|
30
|
+
def search_doc(attribute, elements)
|
|
31
|
+
regexp = attribute == :srcset ? srcset_attribute_regexp : target_regexp
|
|
38
32
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
33
|
+
doc.css(*elements.map { |element| "#{element}[#{attribute}]" }).find_all do |node|
|
|
34
|
+
node[attribute].match?(regexp)
|
|
35
|
+
end
|
|
36
|
+
end
|
|
42
37
|
|
|
43
|
-
|
|
44
|
-
|
|
38
|
+
def srcset_attribute_regexp
|
|
39
|
+
@srcset_attribute_regexp ||= /(?:^|\b)#{target_regexp_str}\s/
|
|
40
|
+
end
|
|
45
41
|
end
|
|
46
42
|
end
|
|
47
43
|
end
|
|
@@ -1,34 +1,50 @@
|
|
|
1
1
|
module Webmention
|
|
2
2
|
module Verification
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
3
|
+
module Verifiers
|
|
4
|
+
class JsonVerifier < BaseVerifier
|
|
5
|
+
def self.mime_types
|
|
6
|
+
['application/json']
|
|
7
|
+
end
|
|
7
8
|
|
|
8
|
-
|
|
9
|
+
Verifiers.register(self)
|
|
9
10
|
|
|
10
|
-
|
|
11
|
-
value.is_a?(String) && value.match?(target_regexp)
|
|
12
|
-
end
|
|
11
|
+
private
|
|
13
12
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
13
|
+
def parse_response_body
|
|
14
|
+
DeepLocator.new(JSON.parse(response_body), target_regexp).results
|
|
15
|
+
end
|
|
17
16
|
|
|
18
|
-
|
|
19
|
-
|
|
17
|
+
class DeepLocator
|
|
18
|
+
def initialize(json, pattern)
|
|
19
|
+
@json = json
|
|
20
|
+
@pattern = pattern
|
|
20
21
|
end
|
|
21
|
-
end
|
|
22
22
|
|
|
23
|
-
|
|
24
|
-
|
|
23
|
+
def results
|
|
24
|
+
@results ||= build_results(comparator, @json)
|
|
25
|
+
end
|
|
25
26
|
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
27
|
+
def self.values_for(object)
|
|
28
|
+
object.is_a?(Hash) ? object.values : object.entries
|
|
29
|
+
end
|
|
29
30
|
|
|
30
|
-
|
|
31
|
-
|
|
31
|
+
private
|
|
32
|
+
|
|
33
|
+
# :reek:TooManyStatements { max_statements: 6 }
|
|
34
|
+
def build_results(comparator, object, matches = [])
|
|
35
|
+
return matches unless object.is_a?(Enumerable)
|
|
36
|
+
|
|
37
|
+
matches << object if object.any? { |_, value| comparator.call(value) }
|
|
38
|
+
|
|
39
|
+
self.class.values_for(object).each { |value| build_results(comparator, value, matches) }
|
|
40
|
+
|
|
41
|
+
matches
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def comparator
|
|
45
|
+
@comparator ||= ->(value) { value.is_a?(String) && value.match?(@pattern) }
|
|
46
|
+
end
|
|
47
|
+
end
|
|
32
48
|
end
|
|
33
49
|
end
|
|
34
50
|
end
|
|
@@ -1,18 +1,22 @@
|
|
|
1
1
|
module Webmention
|
|
2
2
|
module Verification
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
3
|
+
module Verifiers
|
|
4
|
+
class PlaintextVerifier < BaseVerifier
|
|
5
|
+
def self.mime_types
|
|
6
|
+
['text/plain']
|
|
7
|
+
end
|
|
7
8
|
|
|
8
|
-
|
|
9
|
+
Verifiers.register(self)
|
|
9
10
|
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
11
|
+
private
|
|
12
|
+
|
|
13
|
+
def parse_response_body
|
|
14
|
+
response_body.scan(target_regexp)
|
|
15
|
+
end
|
|
13
16
|
|
|
14
|
-
|
|
15
|
-
|
|
17
|
+
def target_regexp
|
|
18
|
+
@target_regexp ||= /(?:^|\s)#{target_regexp_str}(?:\s|$)/
|
|
19
|
+
end
|
|
16
20
|
end
|
|
17
21
|
end
|
|
18
22
|
end
|
|
@@ -20,16 +20,17 @@ Gem::Specification.new do |spec|
|
|
|
20
20
|
|
|
21
21
|
spec.require_paths = ['lib']
|
|
22
22
|
|
|
23
|
-
spec.add_development_dependency 'bundler', '~> 1.17'
|
|
24
23
|
spec.add_development_dependency 'rake', '~> 12.3'
|
|
24
|
+
spec.add_development_dependency 'reek', '~> 5.4'
|
|
25
25
|
spec.add_development_dependency 'rspec', '~> 3.8'
|
|
26
|
-
spec.add_development_dependency 'rubocop', '~> 0.
|
|
27
|
-
spec.add_development_dependency 'rubocop-
|
|
26
|
+
spec.add_development_dependency 'rubocop', '~> 0.67.2'
|
|
27
|
+
spec.add_development_dependency 'rubocop-performance', '~> 1.1'
|
|
28
|
+
spec.add_development_dependency 'rubocop-rspec', '~> 1.32'
|
|
28
29
|
spec.add_development_dependency 'simplecov', '~> 0.16.1'
|
|
29
30
|
spec.add_development_dependency 'simplecov-console', '~> 0.4.2'
|
|
30
|
-
spec.add_development_dependency 'webmock', '~> 3.
|
|
31
|
+
spec.add_development_dependency 'webmock', '~> 3.5'
|
|
31
32
|
|
|
32
|
-
spec.add_runtime_dependency 'addressable', '~> 2.
|
|
33
|
-
spec.add_runtime_dependency 'http', '~>
|
|
34
|
-
spec.add_runtime_dependency 'nokogiri', '~> 1.
|
|
33
|
+
spec.add_runtime_dependency 'addressable', '~> 2.6'
|
|
34
|
+
spec.add_runtime_dependency 'http', '~> 5.0.0.pre'
|
|
35
|
+
spec.add_runtime_dependency 'nokogiri', '~> 1.10'
|
|
35
36
|
end
|
metadata
CHANGED
|
@@ -1,43 +1,43 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: webmention-verification
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 1.0.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Jason Garber
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2019-
|
|
11
|
+
date: 2019-04-26 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
|
-
name:
|
|
14
|
+
name: rake
|
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
|
16
16
|
requirements:
|
|
17
17
|
- - "~>"
|
|
18
18
|
- !ruby/object:Gem::Version
|
|
19
|
-
version: '
|
|
19
|
+
version: '12.3'
|
|
20
20
|
type: :development
|
|
21
21
|
prerelease: false
|
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
|
23
23
|
requirements:
|
|
24
24
|
- - "~>"
|
|
25
25
|
- !ruby/object:Gem::Version
|
|
26
|
-
version: '
|
|
26
|
+
version: '12.3'
|
|
27
27
|
- !ruby/object:Gem::Dependency
|
|
28
|
-
name:
|
|
28
|
+
name: reek
|
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
|
30
30
|
requirements:
|
|
31
31
|
- - "~>"
|
|
32
32
|
- !ruby/object:Gem::Version
|
|
33
|
-
version: '
|
|
33
|
+
version: '5.4'
|
|
34
34
|
type: :development
|
|
35
35
|
prerelease: false
|
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
|
37
37
|
requirements:
|
|
38
38
|
- - "~>"
|
|
39
39
|
- !ruby/object:Gem::Version
|
|
40
|
-
version: '
|
|
40
|
+
version: '5.4'
|
|
41
41
|
- !ruby/object:Gem::Dependency
|
|
42
42
|
name: rspec
|
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -58,28 +58,42 @@ dependencies:
|
|
|
58
58
|
requirements:
|
|
59
59
|
- - "~>"
|
|
60
60
|
- !ruby/object:Gem::Version
|
|
61
|
-
version: 0.
|
|
61
|
+
version: 0.67.2
|
|
62
|
+
type: :development
|
|
63
|
+
prerelease: false
|
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
65
|
+
requirements:
|
|
66
|
+
- - "~>"
|
|
67
|
+
- !ruby/object:Gem::Version
|
|
68
|
+
version: 0.67.2
|
|
69
|
+
- !ruby/object:Gem::Dependency
|
|
70
|
+
name: rubocop-performance
|
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
|
72
|
+
requirements:
|
|
73
|
+
- - "~>"
|
|
74
|
+
- !ruby/object:Gem::Version
|
|
75
|
+
version: '1.1'
|
|
62
76
|
type: :development
|
|
63
77
|
prerelease: false
|
|
64
78
|
version_requirements: !ruby/object:Gem::Requirement
|
|
65
79
|
requirements:
|
|
66
80
|
- - "~>"
|
|
67
81
|
- !ruby/object:Gem::Version
|
|
68
|
-
version:
|
|
82
|
+
version: '1.1'
|
|
69
83
|
- !ruby/object:Gem::Dependency
|
|
70
84
|
name: rubocop-rspec
|
|
71
85
|
requirement: !ruby/object:Gem::Requirement
|
|
72
86
|
requirements:
|
|
73
87
|
- - "~>"
|
|
74
88
|
- !ruby/object:Gem::Version
|
|
75
|
-
version: '1.
|
|
89
|
+
version: '1.32'
|
|
76
90
|
type: :development
|
|
77
91
|
prerelease: false
|
|
78
92
|
version_requirements: !ruby/object:Gem::Requirement
|
|
79
93
|
requirements:
|
|
80
94
|
- - "~>"
|
|
81
95
|
- !ruby/object:Gem::Version
|
|
82
|
-
version: '1.
|
|
96
|
+
version: '1.32'
|
|
83
97
|
- !ruby/object:Gem::Dependency
|
|
84
98
|
name: simplecov
|
|
85
99
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -114,56 +128,56 @@ dependencies:
|
|
|
114
128
|
requirements:
|
|
115
129
|
- - "~>"
|
|
116
130
|
- !ruby/object:Gem::Version
|
|
117
|
-
version: '3.
|
|
131
|
+
version: '3.5'
|
|
118
132
|
type: :development
|
|
119
133
|
prerelease: false
|
|
120
134
|
version_requirements: !ruby/object:Gem::Requirement
|
|
121
135
|
requirements:
|
|
122
136
|
- - "~>"
|
|
123
137
|
- !ruby/object:Gem::Version
|
|
124
|
-
version: '3.
|
|
138
|
+
version: '3.5'
|
|
125
139
|
- !ruby/object:Gem::Dependency
|
|
126
140
|
name: addressable
|
|
127
141
|
requirement: !ruby/object:Gem::Requirement
|
|
128
142
|
requirements:
|
|
129
143
|
- - "~>"
|
|
130
144
|
- !ruby/object:Gem::Version
|
|
131
|
-
version: '2.
|
|
145
|
+
version: '2.6'
|
|
132
146
|
type: :runtime
|
|
133
147
|
prerelease: false
|
|
134
148
|
version_requirements: !ruby/object:Gem::Requirement
|
|
135
149
|
requirements:
|
|
136
150
|
- - "~>"
|
|
137
151
|
- !ruby/object:Gem::Version
|
|
138
|
-
version: '2.
|
|
152
|
+
version: '2.6'
|
|
139
153
|
- !ruby/object:Gem::Dependency
|
|
140
154
|
name: http
|
|
141
155
|
requirement: !ruby/object:Gem::Requirement
|
|
142
156
|
requirements:
|
|
143
157
|
- - "~>"
|
|
144
158
|
- !ruby/object:Gem::Version
|
|
145
|
-
version:
|
|
159
|
+
version: 5.0.0.pre
|
|
146
160
|
type: :runtime
|
|
147
161
|
prerelease: false
|
|
148
162
|
version_requirements: !ruby/object:Gem::Requirement
|
|
149
163
|
requirements:
|
|
150
164
|
- - "~>"
|
|
151
165
|
- !ruby/object:Gem::Version
|
|
152
|
-
version:
|
|
166
|
+
version: 5.0.0.pre
|
|
153
167
|
- !ruby/object:Gem::Dependency
|
|
154
168
|
name: nokogiri
|
|
155
169
|
requirement: !ruby/object:Gem::Requirement
|
|
156
170
|
requirements:
|
|
157
171
|
- - "~>"
|
|
158
172
|
- !ruby/object:Gem::Version
|
|
159
|
-
version: '1.
|
|
173
|
+
version: '1.10'
|
|
160
174
|
type: :runtime
|
|
161
175
|
prerelease: false
|
|
162
176
|
version_requirements: !ruby/object:Gem::Requirement
|
|
163
177
|
requirements:
|
|
164
178
|
- - "~>"
|
|
165
179
|
- !ruby/object:Gem::Version
|
|
166
|
-
version: '1.
|
|
180
|
+
version: '1.10'
|
|
167
181
|
description: Verify a received webmention.
|
|
168
182
|
email:
|
|
169
183
|
- jason@sixtwothree.org
|
|
@@ -173,6 +187,7 @@ extra_rdoc_files: []
|
|
|
173
187
|
files:
|
|
174
188
|
- ".editorconfig"
|
|
175
189
|
- ".gitignore"
|
|
190
|
+
- ".reek.yml"
|
|
176
191
|
- ".rspec"
|
|
177
192
|
- ".rubocop"
|
|
178
193
|
- ".rubocop.yml"
|
|
@@ -187,8 +202,9 @@ files:
|
|
|
187
202
|
- Rakefile
|
|
188
203
|
- lib/webmention/verification.rb
|
|
189
204
|
- lib/webmention/verification/client.rb
|
|
190
|
-
- lib/webmention/verification/
|
|
191
|
-
- lib/webmention/verification/
|
|
205
|
+
- lib/webmention/verification/exceptions.rb
|
|
206
|
+
- lib/webmention/verification/registerable.rb
|
|
207
|
+
- lib/webmention/verification/verifiers.rb
|
|
192
208
|
- lib/webmention/verification/verifiers/html_verifier.rb
|
|
193
209
|
- lib/webmention/verification/verifiers/json_verifier.rb
|
|
194
210
|
- lib/webmention/verification/verifiers/plaintext_verifier.rb
|
|
@@ -216,7 +232,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
216
232
|
- !ruby/object:Gem::Version
|
|
217
233
|
version: '0'
|
|
218
234
|
requirements: []
|
|
219
|
-
rubygems_version: 3.0.
|
|
235
|
+
rubygems_version: 3.0.3
|
|
220
236
|
signing_key:
|
|
221
237
|
specification_version: 4
|
|
222
238
|
summary: Verify a received webmention.
|
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
module Webmention
|
|
2
|
-
module Verification
|
|
3
|
-
class Verifier
|
|
4
|
-
attr_reader :response, :target
|
|
5
|
-
|
|
6
|
-
def initialize(response, target, strict: true)
|
|
7
|
-
raise ArgumentError, "response must be an HTTP::Response (given #{response.class.name})" unless response.is_a?(HTTP::Response)
|
|
8
|
-
raise ArgumentError, "target must be a String (given #{target.class.name})" unless target.is_a?(String)
|
|
9
|
-
|
|
10
|
-
@response = response
|
|
11
|
-
@target = target
|
|
12
|
-
@strict = strict
|
|
13
|
-
|
|
14
|
-
raise UnsupportedMimeTypeError, "Unsupported MIME Type: #{response.mime_type}" unless self.class.mime_types.include?(response.mime_type)
|
|
15
|
-
end
|
|
16
|
-
|
|
17
|
-
def results
|
|
18
|
-
@results ||= parse_response_body
|
|
19
|
-
end
|
|
20
|
-
|
|
21
|
-
def verified?
|
|
22
|
-
results.any?
|
|
23
|
-
end
|
|
24
|
-
|
|
25
|
-
class << self
|
|
26
|
-
def inherited(base)
|
|
27
|
-
subclasses << base
|
|
28
|
-
|
|
29
|
-
super(base)
|
|
30
|
-
end
|
|
31
|
-
|
|
32
|
-
def mime_types
|
|
33
|
-
mime_types = []
|
|
34
|
-
|
|
35
|
-
subclasses.each { |subclass| mime_types << subclass.mime_types }
|
|
36
|
-
|
|
37
|
-
mime_types.flatten.sort
|
|
38
|
-
end
|
|
39
|
-
|
|
40
|
-
def subclasses
|
|
41
|
-
@subclasses ||= []
|
|
42
|
-
end
|
|
43
|
-
end
|
|
44
|
-
|
|
45
|
-
private
|
|
46
|
-
|
|
47
|
-
def response_body
|
|
48
|
-
@response_body ||= response.body.to_s
|
|
49
|
-
end
|
|
50
|
-
|
|
51
|
-
def target_regexp_str
|
|
52
|
-
return target if @strict
|
|
53
|
-
|
|
54
|
-
target.sub(%r{https?://}, 'https?://')
|
|
55
|
-
end
|
|
56
|
-
end
|
|
57
|
-
end
|
|
58
|
-
end
|