diaspora_federation 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +55 -5
- data/lib/diaspora_federation.rb +43 -79
- data/lib/diaspora_federation/callbacks.rb +62 -0
- data/lib/diaspora_federation/entity.rb +146 -0
- data/lib/diaspora_federation/logging.rb +3 -4
- data/lib/diaspora_federation/properties_dsl.rb +106 -0
- data/lib/diaspora_federation/version.rb +1 -2
- data/lib/diaspora_federation/web_finger.rb +0 -1
- data/lib/diaspora_federation/web_finger/exceptions.rb +1 -5
- data/lib/diaspora_federation/web_finger/h_card.rb +101 -127
- data/lib/diaspora_federation/web_finger/host_meta.rb +0 -7
- data/lib/diaspora_federation/web_finger/web_finger.rb +79 -110
- data/lib/diaspora_federation/web_finger/xrd_document.rb +0 -3
- data/lib/tasks/build.rake +17 -0
- metadata +20 -30
- data/Rakefile +0 -26
- data/app/controllers/diaspora_federation/application_controller.rb +0 -6
- data/app/controllers/diaspora_federation/h_card_controller.rb +0 -20
- data/app/controllers/diaspora_federation/receive_controller.rb +0 -35
- data/app/controllers/diaspora_federation/webfinger_controller.rb +0 -60
- data/config/routes.rb +0 -15
- data/lib/diaspora_federation/engine.rb +0 -15
@@ -1,7 +1,6 @@
|
|
1
1
|
|
2
2
|
module DiasporaFederation
|
3
3
|
module WebFinger
|
4
|
-
##
|
5
4
|
# Generates and parses Host Meta documents.
|
6
5
|
#
|
7
6
|
# This is a minimal implementation of the standard, only to the degree of what
|
@@ -23,7 +22,6 @@ module DiasporaFederation
|
|
23
22
|
# URL fragment to append to the base URL
|
24
23
|
WEBFINGER_SUFFIX = "webfinger?q={uri}"
|
25
24
|
|
26
|
-
##
|
27
25
|
# Returns the WebFinger URL that was used to build this instance (either from
|
28
26
|
# xml or by giving a base URL).
|
29
27
|
# @return [String] WebFinger template URL
|
@@ -31,7 +29,6 @@ module DiasporaFederation
|
|
31
29
|
@webfinger_url
|
32
30
|
end
|
33
31
|
|
34
|
-
##
|
35
32
|
# Produces the XML string for the Host Meta instance with a +Link+ element
|
36
33
|
# containing the +webfinger_url+.
|
37
34
|
# @return [String] XML string
|
@@ -43,7 +40,6 @@ module DiasporaFederation
|
|
43
40
|
doc.to_xml
|
44
41
|
end
|
45
42
|
|
46
|
-
##
|
47
43
|
# Builds a new HostMeta instance and constructs the WebFinger URL from the
|
48
44
|
# given base URL by appending HostMeta::WEBFINGER_SUFFIX.
|
49
45
|
# @return [HostMeta]
|
@@ -60,7 +56,6 @@ module DiasporaFederation
|
|
60
56
|
hm
|
61
57
|
end
|
62
58
|
|
63
|
-
##
|
64
59
|
# Reads the given Host Meta XML document string and populates the
|
65
60
|
# +webfinger_url+.
|
66
61
|
# @param [String] hostmeta_xml Host Meta XML string
|
@@ -77,7 +72,6 @@ module DiasporaFederation
|
|
77
72
|
hm
|
78
73
|
end
|
79
74
|
|
80
|
-
##
|
81
75
|
# Applies some basic sanity-checking to the given URL
|
82
76
|
# @param [String] url validation subject
|
83
77
|
# @return [Boolean] validation result
|
@@ -86,7 +80,6 @@ module DiasporaFederation
|
|
86
80
|
end
|
87
81
|
private_class_method :webfinger_url_valid?
|
88
82
|
|
89
|
-
##
|
90
83
|
# Gets the webfinger url from an XRD data structure
|
91
84
|
# @param [Hash] data extracted data
|
92
85
|
# @return [String] webfinger url
|
@@ -1,6 +1,5 @@
|
|
1
1
|
module DiasporaFederation
|
2
2
|
module WebFinger
|
3
|
-
##
|
4
3
|
# The WebFinger document used for Diaspora* user discovery is based on an older
|
5
4
|
# draft of the specification you can find in the wiki of the "webfinger" project
|
6
5
|
# on {http://code.google.com/p/webfinger/wiki/WebFingerProtocol Google Code}
|
@@ -9,18 +8,18 @@ module DiasporaFederation
|
|
9
8
|
# In the meantime an actual RFC draft has been in development, which should
|
10
9
|
# serve as a base for all future changes of this implementation.
|
11
10
|
#
|
12
|
-
# @example Creating a WebFinger document from
|
13
|
-
# wf = WebFinger.
|
11
|
+
# @example Creating a WebFinger document from a person hash
|
12
|
+
# wf = WebFinger.new(
|
14
13
|
# acct_uri: "acct:user@server.example",
|
15
14
|
# alias_url: "https://server.example/people/0123456789abcdef",
|
16
|
-
# hcard_url: "https://server.example/hcard/users/
|
15
|
+
# hcard_url: "https://server.example/hcard/users/user",
|
17
16
|
# seed_url: "https://server.example/",
|
18
17
|
# profile_url: "https://server.example/u/user",
|
19
18
|
# atom_url: "https://server.example/public/user.atom",
|
20
19
|
# salmon_url: "https://server.example/receive/users/0123456789abcdef",
|
21
20
|
# guid: "0123456789abcdef",
|
22
|
-
#
|
23
|
-
#
|
21
|
+
# public_key: "-----BEGIN PUBLIC KEY-----\nABCDEF==\n-----END PUBLIC KEY-----"
|
22
|
+
# )
|
24
23
|
# xml_string = wf.to_xml
|
25
24
|
#
|
26
25
|
# @example Creating a WebFinger instance from an xml document
|
@@ -34,62 +33,72 @@ module DiasporaFederation
|
|
34
33
|
# @see http://code.google.com/p/webfinger/wiki/CommonLinkRelations
|
35
34
|
# @see http://www.iana.org/assignments/link-relations/link-relations.xhtml
|
36
35
|
# official list of IANA link relations
|
37
|
-
class WebFinger
|
38
|
-
|
39
|
-
|
40
|
-
#
|
41
|
-
#
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
#
|
46
|
-
|
47
|
-
|
48
|
-
#
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
#
|
57
|
-
#
|
36
|
+
class WebFinger < Entity
|
37
|
+
# @!attribute [r] acct_uri
|
38
|
+
# The Subject element should contain the webfinger address that was asked
|
39
|
+
# for. If it does not, then this webfinger profile MUST be ignored.
|
40
|
+
# @return [String]
|
41
|
+
property :acct_uri
|
42
|
+
|
43
|
+
# @!attribute [r] alias_url
|
44
|
+
# @return [String] link to the users profile
|
45
|
+
property :alias_url
|
46
|
+
|
47
|
+
# @!attribute [r] hcard_url
|
48
|
+
# @return [String] link to the +hCard+
|
49
|
+
property :hcard_url
|
50
|
+
|
51
|
+
# @!attribute [r] seed_url
|
52
|
+
# @return [String] link to the pod
|
53
|
+
property :seed_url
|
54
|
+
|
55
|
+
# @!attribute [r] profile_url
|
56
|
+
# @return [String] link to the users profile
|
57
|
+
property :profile_url
|
58
|
+
|
59
|
+
# @!attribute [r] atom_url
|
60
|
+
# This atom feed is an Activity Stream of the user's public posts. Diaspora
|
61
|
+
# pods SHOULD publish an Activity Stream of public posts, but there is
|
62
|
+
# currently no requirement to be able to read Activity Streams.
|
63
|
+
# @see http://activitystrea.ms/ Activity Streams specification
|
58
64
|
#
|
59
|
-
#
|
60
|
-
#
|
61
|
-
#
|
62
|
-
|
63
|
-
|
64
|
-
#
|
65
|
-
#
|
66
|
-
#
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
#
|
71
|
-
#
|
65
|
+
# Note that this feed MAY also be made available through the PubSubHubbub
|
66
|
+
# mechanism by supplying a <link rel="hub"> in the atom feed itself.
|
67
|
+
# @return [String] atom feed url
|
68
|
+
property :atom_url
|
69
|
+
|
70
|
+
# @!attribute [r] salmon_url
|
71
|
+
# @return [String] salmon endpoint url
|
72
|
+
# @see http://salmon-protocol.googlecode.com/svn/trunk/draft-panzer-salmon-00.html#SMLR
|
73
|
+
# Panzer draft for Salmon, paragraph 3.3
|
74
|
+
property :salmon_url
|
75
|
+
|
76
|
+
# @!attribute [r] guid
|
77
|
+
# @deprecated Either convert these to +Property+ elements or move to the
|
78
|
+
# +hCard+, which actually has fields for an +UID+ defined in the +vCard+
|
79
|
+
# specification (will affect older Diaspora* installations).
|
72
80
|
#
|
73
|
-
#
|
81
|
+
# @see HCard#guid
|
74
82
|
#
|
75
|
-
#
|
76
|
-
#
|
77
|
-
#
|
78
|
-
#
|
79
|
-
|
80
|
-
|
81
|
-
#
|
82
|
-
#
|
83
|
-
#
|
83
|
+
# This is just the guid. When a user creates an account on a pod, the pod
|
84
|
+
# MUST assign them a guid - a random hexadecimal string of at least 8
|
85
|
+
# hexadecimal digits.
|
86
|
+
# @return [String] guid
|
87
|
+
property :guid
|
88
|
+
|
89
|
+
# @!attribute [r] public_key
|
90
|
+
# @deprecated Either convert these to +Property+ elements or move to the
|
91
|
+
# +hCard+, which actually has fields for an +KEY+ defined in the +vCard+
|
92
|
+
# specification (will affect older Diaspora* installations).
|
84
93
|
#
|
85
|
-
#
|
94
|
+
# @see HCard#pubkey
|
86
95
|
#
|
87
|
-
#
|
88
|
-
#
|
89
|
-
#
|
90
|
-
#
|
91
|
-
#
|
92
|
-
|
96
|
+
# When a user is created on the pod, the pod MUST generate a pgp keypair
|
97
|
+
# for them. This key is used for signing messages. The format is a
|
98
|
+
# DER-encoded PKCS#1 key beginning with the text
|
99
|
+
# "-----BEGIN PUBLIC KEY-----" and ending with "-----END PUBLIC KEY-----".
|
100
|
+
# @return [String] public key
|
101
|
+
property :public_key
|
93
102
|
|
94
103
|
# +hcard_url+ link relation
|
95
104
|
REL_HCARD = "http://microformats.org/profile/hcard"
|
@@ -131,31 +140,6 @@ module DiasporaFederation
|
|
131
140
|
doc.to_xml
|
132
141
|
end
|
133
142
|
|
134
|
-
# Create a WebFinger instance from the given person data Hash.
|
135
|
-
# @param [Hash] data account data
|
136
|
-
# @return [WebFinger] WebFinger instance
|
137
|
-
# @raise [InvalidData] if the given data Hash is invalid or incomplete
|
138
|
-
def self.from_person(data)
|
139
|
-
raise InvalidData, "person data incomplete" unless account_data_complete?(data)
|
140
|
-
|
141
|
-
wf = allocate
|
142
|
-
wf.instance_eval {
|
143
|
-
@acct_uri = data[:acct_uri]
|
144
|
-
@alias_url = data[:alias_url]
|
145
|
-
@hcard_url = data[:hcard_url]
|
146
|
-
@seed_url = data[:seed_url]
|
147
|
-
@profile_url = data[:profile_url]
|
148
|
-
@atom_url = data[:atom_url]
|
149
|
-
@salmon_url = data[:salmon_url]
|
150
|
-
|
151
|
-
# TODO: remove me! #########
|
152
|
-
@guid = data[:guid]
|
153
|
-
@pubkey = data[:pubkey]
|
154
|
-
#############################
|
155
|
-
}
|
156
|
-
wf
|
157
|
-
end
|
158
|
-
|
159
143
|
# Create a WebFinger instance from the given XML string.
|
160
144
|
# @param [String] webfinger_xml WebFinger XML string
|
161
145
|
# @return [WebFinger] WebFinger instance
|
@@ -163,40 +147,25 @@ module DiasporaFederation
|
|
163
147
|
def self.from_xml(webfinger_xml)
|
164
148
|
data = parse_xml_and_validate(webfinger_xml)
|
165
149
|
|
166
|
-
hcard_url, seed_url, guid, profile_url, atom_url, salmon_url,
|
150
|
+
hcard_url, seed_url, guid, profile_url, atom_url, salmon_url, public_key = parse_links(data)
|
167
151
|
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
@salmon_url = salmon_url
|
152
|
+
new(
|
153
|
+
acct_uri: data[:subject],
|
154
|
+
alias_url: data[:aliases].first,
|
155
|
+
hcard_url: hcard_url,
|
156
|
+
seed_url: seed_url,
|
157
|
+
profile_url: profile_url,
|
158
|
+
atom_url: atom_url,
|
159
|
+
salmon_url: salmon_url,
|
177
160
|
|
178
161
|
# TODO: remove me! ##########
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
}
|
183
|
-
wf
|
162
|
+
guid: guid,
|
163
|
+
public_key: Base64.strict_decode64(public_key)
|
164
|
+
)
|
184
165
|
end
|
185
166
|
|
186
167
|
private
|
187
168
|
|
188
|
-
# Checks the given account data Hash for correct type and completeness.
|
189
|
-
# @param [Hash] data account data
|
190
|
-
# @return [Boolean] validation result
|
191
|
-
def self.account_data_complete?(data)
|
192
|
-
data.instance_of?(Hash) &&
|
193
|
-
%i(
|
194
|
-
acct_uri alias_url hcard_url seed_url
|
195
|
-
guid profile_url atom_url salmon_url pubkey
|
196
|
-
).all? {|k| data.key? k }
|
197
|
-
end
|
198
|
-
private_class_method :account_data_complete?
|
199
|
-
|
200
169
|
# Parses the XML string to a Hash and does some rudimentary checking on
|
201
170
|
# the data Hash.
|
202
171
|
# @param [String] webfinger_xml WebFinger XML string
|
@@ -236,7 +205,7 @@ module DiasporaFederation
|
|
236
205
|
# TODO: remove me! ##############
|
237
206
|
doc.links << {rel: REL_PUBKEY,
|
238
207
|
type: "RSA",
|
239
|
-
href: Base64.strict_encode64(@
|
208
|
+
href: Base64.strict_encode64(@public_key)}
|
240
209
|
##################################
|
241
210
|
end
|
242
211
|
|
@@ -1,6 +1,5 @@
|
|
1
1
|
module DiasporaFederation
|
2
2
|
module WebFinger
|
3
|
-
##
|
4
3
|
# This class implements basic handling of XRD documents as far as it is
|
5
4
|
# necessary in the context of the protocols used with Diaspora* federation.
|
6
5
|
#
|
@@ -65,7 +64,6 @@ module DiasporaFederation
|
|
65
64
|
@properties = {}
|
66
65
|
end
|
67
66
|
|
68
|
-
##
|
69
67
|
# Generates an XML document from the current instance and returns it as string
|
70
68
|
# @return [String] XML document
|
71
69
|
def to_xml
|
@@ -83,7 +81,6 @@ module DiasporaFederation
|
|
83
81
|
builder.to_xml
|
84
82
|
end
|
85
83
|
|
86
|
-
##
|
87
84
|
# Parse the XRD document from the given string and create a hash containing
|
88
85
|
# the extracted data.
|
89
86
|
#
|
@@ -0,0 +1,17 @@
|
|
1
|
+
desc "Build gem into the pkg directory"
|
2
|
+
task build: :test do
|
3
|
+
FileUtils.rm_rf("pkg")
|
4
|
+
Dir["*.gemspec"].each do |gemspec|
|
5
|
+
system "gem build #{gemspec}"
|
6
|
+
end
|
7
|
+
FileUtils.mkdir_p("pkg")
|
8
|
+
FileUtils.mv(Dir["*.gem"], "pkg")
|
9
|
+
end
|
10
|
+
|
11
|
+
desc "Tags version, pushes to remote, and pushes gem"
|
12
|
+
task release: :build do
|
13
|
+
sh "git tag v#{DiasporaFederation::VERSION}"
|
14
|
+
sh "git push origin master"
|
15
|
+
sh "git push origin v#{DiasporaFederation::VERSION}"
|
16
|
+
sh "ls pkg/*.gem | xargs -n 1 gem push"
|
17
|
+
end
|
metadata
CHANGED
@@ -1,45 +1,38 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: diaspora_federation
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Benjamin Neff
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-07-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
-
- !ruby/object:Gem::Dependency
|
14
|
-
name: rails
|
15
|
-
requirement: !ruby/object:Gem::Requirement
|
16
|
-
requirements:
|
17
|
-
- - "~>"
|
18
|
-
- !ruby/object:Gem::Version
|
19
|
-
version: 4.2.2
|
20
|
-
type: :runtime
|
21
|
-
prerelease: false
|
22
|
-
version_requirements: !ruby/object:Gem::Requirement
|
23
|
-
requirements:
|
24
|
-
- - "~>"
|
25
|
-
- !ruby/object:Gem::Version
|
26
|
-
version: 4.2.2
|
27
13
|
- !ruby/object:Gem::Dependency
|
28
14
|
name: nokogiri
|
29
15
|
requirement: !ruby/object:Gem::Requirement
|
30
16
|
requirements:
|
31
17
|
- - "~>"
|
32
18
|
- !ruby/object:Gem::Version
|
33
|
-
version: 1.6
|
19
|
+
version: '1.6'
|
20
|
+
- - ">="
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: 1.6.6
|
34
23
|
type: :runtime
|
35
24
|
prerelease: false
|
36
25
|
version_requirements: !ruby/object:Gem::Requirement
|
37
26
|
requirements:
|
38
27
|
- - "~>"
|
39
28
|
- !ruby/object:Gem::Version
|
40
|
-
version: 1.6
|
41
|
-
|
42
|
-
|
29
|
+
version: '1.6'
|
30
|
+
- - ">="
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: 1.6.6
|
33
|
+
description: This gem provides the functionality for de-/serialization and de-/encryption
|
34
|
+
of Entities in the protocols used for communication among the various installations
|
35
|
+
of Diaspora*
|
43
36
|
email:
|
44
37
|
- benjamin@coding4.coffee
|
45
38
|
executables: []
|
@@ -48,15 +41,11 @@ extra_rdoc_files: []
|
|
48
41
|
files:
|
49
42
|
- LICENSE
|
50
43
|
- README.md
|
51
|
-
- Rakefile
|
52
|
-
- app/controllers/diaspora_federation/application_controller.rb
|
53
|
-
- app/controllers/diaspora_federation/h_card_controller.rb
|
54
|
-
- app/controllers/diaspora_federation/receive_controller.rb
|
55
|
-
- app/controllers/diaspora_federation/webfinger_controller.rb
|
56
|
-
- config/routes.rb
|
57
44
|
- lib/diaspora_federation.rb
|
58
|
-
- lib/diaspora_federation/
|
45
|
+
- lib/diaspora_federation/callbacks.rb
|
46
|
+
- lib/diaspora_federation/entity.rb
|
59
47
|
- lib/diaspora_federation/logging.rb
|
48
|
+
- lib/diaspora_federation/properties_dsl.rb
|
60
49
|
- lib/diaspora_federation/version.rb
|
61
50
|
- lib/diaspora_federation/web_finger.rb
|
62
51
|
- lib/diaspora_federation/web_finger/exceptions.rb
|
@@ -64,6 +53,7 @@ files:
|
|
64
53
|
- lib/diaspora_federation/web_finger/host_meta.rb
|
65
54
|
- lib/diaspora_federation/web_finger/web_finger.rb
|
66
55
|
- lib/diaspora_federation/web_finger/xrd_document.rb
|
56
|
+
- lib/tasks/build.rake
|
67
57
|
- lib/tasks/diaspora_federation_tasks.rake
|
68
58
|
- lib/tasks/tests.rake
|
69
59
|
homepage: https://github.com/SuperTux88/diaspora_federation
|
@@ -76,9 +66,9 @@ require_paths:
|
|
76
66
|
- lib
|
77
67
|
required_ruby_version: !ruby/object:Gem::Requirement
|
78
68
|
requirements:
|
79
|
-
- - "
|
69
|
+
- - "~>"
|
80
70
|
- !ruby/object:Gem::Version
|
81
|
-
version: '0'
|
71
|
+
version: '2.0'
|
82
72
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
83
73
|
requirements:
|
84
74
|
- - ">="
|
@@ -89,6 +79,6 @@ rubyforge_project:
|
|
89
79
|
rubygems_version: 2.4.6
|
90
80
|
signing_key:
|
91
81
|
specification_version: 4
|
92
|
-
summary: diaspora* federation
|
82
|
+
summary: diaspora* federation library
|
93
83
|
test_files: []
|
94
84
|
has_rdoc:
|
data/Rakefile
DELETED
@@ -1,26 +0,0 @@
|
|
1
|
-
begin
|
2
|
-
require "bundler/setup"
|
3
|
-
rescue LoadError
|
4
|
-
puts "You must `gem install bundler` and `bundle install` to run rake tasks"
|
5
|
-
end
|
6
|
-
|
7
|
-
require "rdoc/task"
|
8
|
-
|
9
|
-
RDoc::Task.new(:rdoc) do |rdoc|
|
10
|
-
rdoc.rdoc_dir = "rdoc"
|
11
|
-
rdoc.title = "DiasporaFederation"
|
12
|
-
rdoc.options << "--line-numbers"
|
13
|
-
rdoc.rdoc_files.include("lib/**/*.rb")
|
14
|
-
end
|
15
|
-
|
16
|
-
APP_RAKEFILE = File.expand_path("../test/dummy/Rakefile", __FILE__)
|
17
|
-
load "rails/tasks/engine.rake"
|
18
|
-
|
19
|
-
load "rails/tasks/statistics.rake"
|
20
|
-
|
21
|
-
Bundler::GemHelper.install_tasks
|
22
|
-
|
23
|
-
Rails.application.load_tasks
|
24
|
-
|
25
|
-
task test: %w(spec:prepare spec)
|
26
|
-
task default: :test
|