didkit 0.0.3 → 0.0.4

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d974c618ebe4702ec35b8f4e1465b3cc0664d1cf932fd8739ac4371f7c20caa2
4
- data.tar.gz: 66479727000f96ef26d09074bd97cd59d43f14388ea213f25deb846c6e75cb3d
3
+ metadata.gz: 76dd4f3787cf1cc288015511eb35ea6d41ef4c390f85ca67854617fe7c46d710
4
+ data.tar.gz: 40ea426b53fa3176dccd4c538cbd40050a3883bb6632af2b45ca1a6f49ac84b7
5
5
  SHA512:
6
- metadata.gz: b3b84e04e7be85c0af2a544173a14338870fc3163727dd9341a1c76d83ce6397c03f4f28284549c5c07c2c3625e018b81c7a4149c80dac8e817f01f7b724c042
7
- data.tar.gz: e476000c6bbc05a3e5664e2fb44a8bb19e302c2b13d880bfc9d98a2144916b7982d914d41beea55e5775f55a1a3d01a9bd0854ff4cfa9274d86aba4a406441e1
6
+ metadata.gz: a26c81e89e2397bb7690149e143a0de6c9e9635a993e8cd13d572d76b21b38ce37628eb3c3ebc4ea9ffc20b3807f619acb46612a76af9f816b336315a10f7aab
7
+ data.tar.gz: 89b4d9eb1ec2b7f5207587cde9b0a2b2db8a5912a92dc1ef996f0bac493996aae8b1340fc673838c404ac28d4ab191be6e7ce3a984f35a83402b9ef489feea8b
data/CHANGELOG.md CHANGED
@@ -1,3 +1,9 @@
1
+ ## [0.0.4] - 2024-03-07
2
+
3
+ - extracted resolving code from `DID` to a new `Resolver` class (`DID` has helper methods to call the resolver)
4
+ - added `Resolver#get_validated_handle` method to validate handles from the `Document` (+ helpers in `DID` in `Document`)
5
+ - added timeout to `#resolve_handle_by_well_known`
6
+
1
7
  ## [0.0.3] - 2024-03-06
2
8
 
3
9
  - added `Document#handles` with handle info extracted from `alsoKnownAs` field
data/lib/didkit/did.rb CHANGED
@@ -1,54 +1,10 @@
1
- require 'json'
2
- require 'net/http'
3
- require 'open-uri'
4
- require 'resolv'
5
-
6
- require_relative 'document'
7
1
  require_relative 'errors'
2
+ require_relative 'resolver'
8
3
 
9
4
  module DIDKit
10
5
  class DID
11
6
  def self.resolve_handle(handle)
12
- domain = handle.gsub(/^@/, '')
13
-
14
- if dns_did = resolve_handle_by_dns(domain)
15
- DID.new(dns_did, :dns)
16
- elsif http_did = resolve_handle_by_well_known(domain)
17
- DID.new(http_did, :http)
18
- else
19
- nil
20
- end
21
- end
22
-
23
- def self.resolve_handle_by_dns(domain)
24
- dns_records = Resolv::DNS.open { |d| d.getresources("_atproto.#{domain}", Resolv::DNS::Resource::IN::TXT) }
25
-
26
- if record = dns_records.first
27
- if string = record.strings.first
28
- if string =~ /^did\=(did\:\w+\:.*)$/
29
- return $1
30
- end
31
- end
32
- end
33
-
34
- nil
35
- end
36
-
37
- def self.resolve_handle_by_well_known(domain)
38
- url = URI("https://#{domain}/.well-known/atproto-did")
39
- response = Net::HTTP.get_response(url)
40
-
41
- if response.is_a?(Net::HTTPSuccess)
42
- if text = response.body
43
- if text.lines.length == 1 && text.start_with?('did:')
44
- return text
45
- end
46
- end
47
- end
48
-
49
- nil
50
- rescue StandardError => e
51
- nil
7
+ Resolver.new.resolve_handle(handle)
52
8
  end
53
9
 
54
10
  attr_reader :type, :did, :resolved_by
@@ -71,23 +27,25 @@ module DIDKit
71
27
  alias to_s did
72
28
 
73
29
  def get_document
74
- type == :plc ? resolve_did_plc : resolve_did_web
30
+ Resolver.new.resolve_did(self)
75
31
  end
76
32
 
77
- def web_domain
78
- did.gsub(/^did\:web\:/, '') if type == :web
33
+ def get_validated_handle
34
+ Resolver.new.get_validated_handle(self)
79
35
  end
80
36
 
81
- def resolve_did_plc
82
- url = "https://plc.directory/#{did}"
83
- json = JSON.parse(URI.open(url).read)
84
- Document.new(self, json)
37
+ def web_domain
38
+ did.gsub(/^did\:web\:/, '') if type == :web
85
39
  end
86
40
 
87
- def resolve_did_web
88
- url = "https://#{web_domain}/.well-known/did.json"
89
- json = JSON.parse(URI.open(url).read)
90
- Document.new(self, json)
41
+ def ==(other)
42
+ if other.is_a?(String)
43
+ self.did == other
44
+ elsif other.is_a?(DID)
45
+ self.did == other.did
46
+ else
47
+ false
48
+ end
91
49
  end
92
50
  end
93
51
  end
@@ -8,7 +8,7 @@ module DIDKit
8
8
  def initialize(did, json)
9
9
  raise FormatError, "Missing id field" if json['id'].nil?
10
10
  raise FormatError, "Invalid id field" unless json['id'].is_a?(String)
11
- raise FormatError, "Id field doesn't match expected DID" unless json['id'] == did.to_s
11
+ raise FormatError, "id field doesn't match expected DID" unless json['id'] == did.to_s
12
12
 
13
13
  @did = did
14
14
  @json = json
@@ -37,5 +37,9 @@ module DIDKit
37
37
  @handles = []
38
38
  end
39
39
  end
40
+
41
+ def get_validated_handle
42
+ Resolver.new.get_validated_handle(self)
43
+ end
40
44
  end
41
45
  end
@@ -0,0 +1,82 @@
1
+ require 'json'
2
+ require 'open-uri'
3
+ require 'net/http'
4
+ require 'resolv'
5
+
6
+ require_relative 'did'
7
+ require_relative 'document'
8
+
9
+ module DIDKit
10
+ class Resolver
11
+ def resolve_handle(handle)
12
+ domain = handle.gsub(/^@/, '')
13
+
14
+ if dns_did = resolve_handle_by_dns(domain)
15
+ DID.new(dns_did, :dns)
16
+ elsif http_did = resolve_handle_by_well_known(domain)
17
+ DID.new(http_did, :http)
18
+ else
19
+ nil
20
+ end
21
+ end
22
+
23
+ def resolve_handle_by_dns(domain)
24
+ dns_records = Resolv::DNS.open { |d| d.getresources("_atproto.#{domain}", Resolv::DNS::Resource::IN::TXT) }
25
+
26
+ if record = dns_records.first
27
+ if string = record.strings.first
28
+ if string =~ /^did\=(did\:\w+\:.*)$/
29
+ return $1
30
+ end
31
+ end
32
+ end
33
+
34
+ nil
35
+ end
36
+
37
+ def resolve_handle_by_well_known(domain)
38
+ url = URI("https://#{domain}/.well-known/atproto-did")
39
+
40
+ response = Net::HTTP.start(url.host, url.port, use_ssl: true, open_timeout: 10, read_timeout: 10) do |http|
41
+ request = Net::HTTP::Get.new(url)
42
+ http.request(request)
43
+ end
44
+
45
+ if response.is_a?(Net::HTTPSuccess)
46
+ if text = response.body
47
+ if text.lines.length == 1 && text.start_with?('did:')
48
+ return text
49
+ end
50
+ end
51
+ end
52
+
53
+ nil
54
+ rescue StandardError => e
55
+ nil
56
+ end
57
+
58
+ def resolve_did(did)
59
+ did = DID.new(did) if did.is_a?(String)
60
+
61
+ did.type == :plc ? resolve_did_plc(did) : resolve_did_web(did)
62
+ end
63
+
64
+ def resolve_did_plc(did)
65
+ url = "https://plc.directory/#{did}"
66
+ json = JSON.parse(URI.open(url).read)
67
+ Document.new(did, json)
68
+ end
69
+
70
+ def resolve_did_web(did)
71
+ url = "https://#{did.web_domain}/.well-known/did.json"
72
+ json = JSON.parse(URI.open(url).read)
73
+ Document.new(did, json)
74
+ end
75
+
76
+ def get_validated_handle(did_or_doc)
77
+ document = did_or_doc.is_a?(Document) ? did_or_doc : resolve_did(did_or_doc)
78
+
79
+ document.handles.detect { |h| resolve_handle(h) == document.did }
80
+ end
81
+ end
82
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module DIDKit
4
- VERSION = "0.0.3"
4
+ VERSION = "0.0.4"
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: didkit
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kuba Suder
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-03-06 00:00:00.000000000 Z
11
+ date: 2024-03-07 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description:
14
14
  email:
@@ -24,6 +24,7 @@ files:
24
24
  - lib/didkit/did.rb
25
25
  - lib/didkit/document.rb
26
26
  - lib/didkit/errors.rb
27
+ - lib/didkit/resolver.rb
27
28
  - lib/didkit/version.rb
28
29
  - sig/didkit.rbs
29
30
  homepage: https://github.com/mackuba/didkit