didkit 0.0.3 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
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