dav4rack_ext 0.2.0 → 0.2.1
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/.travis.yml +1 -3
- data/lib/dav4rack_ext/carddav/controller.rb +26 -0
- data/lib/dav4rack_ext/carddav/resources/addressbook_resource.rb +6 -0
- data/lib/dav4rack_ext/carddav/resources/contact_resource.rb +9 -0
- data/lib/dav4rack_ext/version.rb +1 -1
- data/specs/helpers/http_dav.rb +30 -0
- data/specs/rfc/rfc6352_spec.rb +33 -4
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7e9aba179c4d57f91f74b9a4ae41ff44d0290121
|
4
|
+
data.tar.gz: 6b0bf9822b2f75bccedc1d936570ba7b34d776ef
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e7848ea5f4c8f6deab94e88ea184faaef5fe9e39e4733d6a094446c71f437c92323f90d0ba8b010f01714d562e347bce58c9d109cc9a3be2ba3f59048fdd7327
|
7
|
+
data.tar.gz: 6e37118a3554e3abaf02a3298f0fb7f314f0709868d7ee531c74ebc84d5142b598903e1db89d6625a157a597f89cd7f14695ed0d7aa294314e0da1995dc4ea9b
|
data/.travis.yml
CHANGED
@@ -28,6 +28,8 @@ module DAV4Rack
|
|
28
28
|
case request_document.root.name
|
29
29
|
when 'addressbook-multiget'
|
30
30
|
addressbook_multiget(request_document)
|
31
|
+
when 'addressbook-query'
|
32
|
+
addressbook_query(request_document)
|
31
33
|
else
|
32
34
|
render_xml(:error) do |xml|
|
33
35
|
xml.send :'supported-report'
|
@@ -53,6 +55,30 @@ module DAV4Rack
|
|
53
55
|
end
|
54
56
|
"*[local-name()='#{name}' and namespace-uri()='#{ns_uri}']"
|
55
57
|
end
|
58
|
+
|
59
|
+
|
60
|
+
def addressbook_query(request_document)
|
61
|
+
|
62
|
+
props = []
|
63
|
+
request_document.css("C|addressbook-query > D|prop", NAMESPACES).each do |el|
|
64
|
+
el.children.select(&:element?).each do |child|
|
65
|
+
props << to_element_hash(child)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
|
70
|
+
contacts = resource.children
|
71
|
+
|
72
|
+
multistatus do |xml|
|
73
|
+
contacts.each do |contact|
|
74
|
+
xml.response do
|
75
|
+
xml.href contact.path
|
76
|
+
propstats(xml, get_properties(contact, props))
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
56
82
|
|
57
83
|
def addressbook_multiget(request_document)
|
58
84
|
# TODO: Include a DAV:error response
|
@@ -25,6 +25,13 @@ module DAV4Rack
|
|
25
25
|
property('getlastmodified') do
|
26
26
|
@contact.updated_at
|
27
27
|
end
|
28
|
+
|
29
|
+
explicit do
|
30
|
+
property('sync-token') do
|
31
|
+
@contact.etag
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
28
35
|
end
|
29
36
|
|
30
37
|
define_properties(CARDAV_NS) do
|
@@ -78,6 +85,8 @@ module DAV4Rack
|
|
78
85
|
raise Conflict if (want_new_contact and @contact)
|
79
86
|
|
80
87
|
if if_match = request.env['HTTP_IF_MATCH']
|
88
|
+
# remove quotes if present
|
89
|
+
if_match = if_match.tr('"', '')
|
81
90
|
# client wants to update a contact, return an error if no
|
82
91
|
# contact was found
|
83
92
|
if (if_match == '*') || !@contact
|
data/lib/dav4rack_ext/version.rb
CHANGED
data/specs/helpers/http_dav.rb
CHANGED
@@ -1,4 +1,34 @@
|
|
1
1
|
module HTTPDAVTest
|
2
|
+
def report(url, properties = [], opts = {})
|
3
|
+
namespaces = {
|
4
|
+
'DAV:' => 'D',
|
5
|
+
'urn:ietf:params:xml:ns:carddav' => 'C'
|
6
|
+
}
|
7
|
+
|
8
|
+
fields_list = properties.map do |prop_name|
|
9
|
+
%{<C:prop name="#{prop_name}"/>}
|
10
|
+
end.join("\n")
|
11
|
+
|
12
|
+
body = <<~EOS
|
13
|
+
<D:prop>
|
14
|
+
<D:getetag/>
|
15
|
+
<C:address-data>
|
16
|
+
#{fields_list}
|
17
|
+
</C:address-data>
|
18
|
+
</D:prop>
|
19
|
+
<C:filter/>
|
20
|
+
EOS
|
21
|
+
|
22
|
+
data = <<~EOS
|
23
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
24
|
+
<C:addressbook-query xmlns:D="DAV:" xmlns:C="urn:ietf:params:xml:ns:carddav">
|
25
|
+
#{body}
|
26
|
+
</C:addressbook-query>
|
27
|
+
EOS
|
28
|
+
|
29
|
+
request('REPORT', url, opts.merge(input: data))
|
30
|
+
end
|
31
|
+
|
2
32
|
def propfind(url, properties = :all, opts = {})
|
3
33
|
namespaces = {
|
4
34
|
'DAV:' => 'D',
|
data/specs/rfc/rfc6352_spec.rb
CHANGED
@@ -182,6 +182,20 @@ END:VCARD
|
|
182
182
|
value.should == :empty
|
183
183
|
end
|
184
184
|
|
185
|
+
it 'DAV:sync-token', focus: true do
|
186
|
+
response = propfind('/books/castor', [
|
187
|
+
['displayname', @dav_ns],
|
188
|
+
['sync-token', @dav_ns]
|
189
|
+
])
|
190
|
+
|
191
|
+
response.status.should == 207
|
192
|
+
|
193
|
+
puts response.body
|
194
|
+
|
195
|
+
value = element_content(response, 'D|sync-token', 'D' => @carddav_ns)
|
196
|
+
value.should == 'TOTO'
|
197
|
+
|
198
|
+
end
|
185
199
|
end
|
186
200
|
|
187
201
|
|
@@ -218,15 +232,30 @@ END:VCARD
|
|
218
232
|
end
|
219
233
|
end
|
220
234
|
|
221
|
-
|
222
|
-
|
235
|
+
describe '[8.6] CARDDAV:addressbook-query Report' do
|
236
|
+
before do
|
237
|
+
# @contact1 = FactoryGirl.build(:contact, uid: '1234-5678-9000-1')
|
238
|
+
# @contact2 = FactoryGirl.build(:contact, uid: '1234-5678-9000-2')
|
239
|
+
end
|
240
|
+
|
241
|
+
should 'return results' do
|
242
|
+
response = report('/books/castor', %w(UID EMAIL FN))
|
243
|
+
# puts response.body
|
244
|
+
elements = ensure_element_exists(response, 'D|multistatus > D|response', 'D' => @dav_ns)
|
245
|
+
|
246
|
+
elements[0].tap do |el|
|
247
|
+
el.css('D|href', 'D' => @dav_ns).first.content.should == "/books/castor/1234-5678-9000-1"
|
248
|
+
el.css('D|getetag', 'D' => @dav_ns).first.content.should == "ETAG"
|
249
|
+
end
|
250
|
+
|
251
|
+
end
|
223
252
|
end
|
224
253
|
|
225
254
|
|
226
255
|
describe '[8.7] CARDDAV:addressbook-multiget Report' do
|
227
256
|
before do
|
228
|
-
@contact = FactoryGirl.build(:contact, uid: '1234-5678-9000-1')
|
229
|
-
@contact.stubs(:vcard).returns(@parsed_vcard)
|
257
|
+
# @contact = FactoryGirl.build(:contact, uid: '1234-5678-9000-1')
|
258
|
+
# @contact.stubs(:vcard).returns(@parsed_vcard)
|
230
259
|
|
231
260
|
|
232
261
|
@raw_query = <<-EOS
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dav4rack_ext
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Julien Ammous
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2018-04-30 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: dav4rack
|
@@ -115,7 +115,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
115
115
|
version: '0'
|
116
116
|
requirements: []
|
117
117
|
rubyforge_project:
|
118
|
-
rubygems_version: 2.
|
118
|
+
rubygems_version: 2.6.8
|
119
119
|
signing_key:
|
120
120
|
specification_version: 4
|
121
121
|
summary: CardDAV / CalDAV implementation.
|