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 +4 -4
- data/CHANGELOG.md +6 -0
- data/lib/didkit/did.rb +15 -57
- data/lib/didkit/document.rb +5 -1
- data/lib/didkit/resolver.rb +82 -0
- data/lib/didkit/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 76dd4f3787cf1cc288015511eb35ea6d41ef4c390f85ca67854617fe7c46d710
|
4
|
+
data.tar.gz: 40ea426b53fa3176dccd4c538cbd40050a3883bb6632af2b45ca1a6f49ac84b7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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
|
-
|
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
|
-
|
30
|
+
Resolver.new.resolve_did(self)
|
75
31
|
end
|
76
32
|
|
77
|
-
def
|
78
|
-
|
33
|
+
def get_validated_handle
|
34
|
+
Resolver.new.get_validated_handle(self)
|
79
35
|
end
|
80
36
|
|
81
|
-
def
|
82
|
-
|
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
|
88
|
-
|
89
|
-
|
90
|
-
|
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
|
data/lib/didkit/document.rb
CHANGED
@@ -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, "
|
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
|
data/lib/didkit/version.rb
CHANGED
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.
|
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-
|
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
|