cronofy 0.22.0 → 0.23.0

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
  SHA1:
3
- metadata.gz: a48c75251078b9b71b6921cb317f6691a9add421
4
- data.tar.gz: b616264212a442276812c5a4a8d944d34e4ba500
3
+ metadata.gz: f49556775f54db6e9d33b86eb11a597abd666d74
4
+ data.tar.gz: b1fcdc132ab95869f21173f4e5b2f0d07f75ae89
5
5
  SHA512:
6
- metadata.gz: 18fb8765fa73771e8b19fdd58e6d349dd792cc82d9e2f8cc817341722e461b74e2d28d7133ddae470ff58cf41441d9dc6b77db118de23e7383586dfa3a44cd61
7
- data.tar.gz: 39a63b0cdf4d63ce838fdbac5bb94d5f8bf6e3cf37b7102760b4f925f4adcfd12b08224dd64a8ce6c570a299074a8f1f4e4529badfb61102c94f96e8c1fcaa45
6
+ metadata.gz: 079b7acfd635b54c5455e729825e501ed0a98468b0879159ea5bb7949ca0088e41cddbc55d139a8de077e864403a643e4fc5d8f2e656c001921a1a8ba500b5c1
7
+ data.tar.gz: 9c21a0271003820802875da88e19b8fa157e37720ac2f5c434ec3cd8d1b945c7220b3fce18071b2c02f402ee6b8fd88d1fe871651a6e019bc8edd74e8d900d01
@@ -1,3 +1,8 @@
1
+ ## [0.23.0]
2
+
3
+ * Support for color with calendar creation and event upsert [#46]
4
+ * Helper to verify push notification HMACs [#45]
5
+
1
6
  ## [0.22.0]
2
7
 
3
8
  * Splitting of Add to Calendar and Real time scheduling [#44]
@@ -64,6 +69,7 @@
64
69
  [0.20.0]: https://github.com/cronofy/cronofy-ruby/releases/tag/v0.20.0
65
70
  [0.21.0]: https://github.com/cronofy/cronofy-ruby/releases/tag/v0.21.0
66
71
  [0.22.0]: https://github.com/cronofy/cronofy-ruby/releases/tag/v0.22.0
72
+ [0.23.0]: https://github.com/cronofy/cronofy-ruby/releases/tag/v0.23.0
67
73
 
68
74
  [#13]: https://github.com/cronofy/cronofy-ruby/pull/13
69
75
  [#16]: https://github.com/cronofy/cronofy-ruby/pull/16
@@ -82,3 +88,5 @@
82
88
  [#40]: https://github.com/cronofy/cronofy-ruby/pull/40
83
89
  [#43]: https://github.com/cronofy/cronofy-ruby/pull/43
84
90
  [#44]: https://github.com/cronofy/cronofy-ruby/pull/44
91
+ [#45]: https://github.com/cronofy/cronofy-ruby/pull/45
92
+ [#46]: https://github.com/cronofy/cronofy-ruby/pull/46
@@ -4,7 +4,10 @@ require "cronofy/types"
4
4
  require "cronofy/auth"
5
5
  require "cronofy/client"
6
6
  require "cronofy/response_parser"
7
+
8
+ require 'base64'
7
9
  require 'json'
10
+ require 'openssl'
8
11
 
9
12
  module Cronofy
10
13
  def self.default_data_centre
@@ -42,13 +42,15 @@ module Cronofy
42
42
  )
43
43
  end
44
44
 
45
- # Public: Creates a new calendar for the account.
45
+ # Public: Creates a new calendar for the profile.
46
46
  #
47
47
  # profile_id - The String ID of the profile to create the calendar within.
48
- # name - A String to use as the name of the calendar.
48
+ # name - The String to use as the name of the calendar.
49
+ # options - The Hash options used to customize the calendar
50
+ # (default: {}):
51
+ # :color - The color to make the calendar (optional).
49
52
  #
50
- # See http://www.cronofy.com/developers/api/alpah#create-calendar for
51
- # reference.
53
+ # See https://www.cronofy.com/developers/api/#create-calendar for reference.
52
54
  #
53
55
  # Returns the created Calendar
54
56
  #
@@ -63,8 +65,9 @@ module Cronofy
63
65
  # state and so a calendar cannot be created.
64
66
  # Raises Cronofy::TooManyRequestsError if the request exceeds the rate
65
67
  # limits for the application.
66
- def create_calendar(profile_id, name)
67
- response = post("/v1/calendars", profile_id: profile_id, name: name)
68
+ def create_calendar(profile_id, name, options = {})
69
+ request = options.merge(profile_id: profile_id, name: name)
70
+ response = post("/v1/calendars", request)
68
71
  parse_json(Calendar, "calendar", response)
69
72
  end
70
73
 
@@ -120,6 +123,7 @@ module Cronofy
120
123
  # occur.
121
124
  # :transparency - The transparency state for the event (optional).
122
125
  # Accepted values are "transparent" and "opaque".
126
+ # :color - The color of the event (optional).
123
127
  # :attendees - A Hash of :invite and :reject, each of which is
124
128
  # an array of invitees to invite to or reject from
125
129
  # the event. Invitees are represented by a hash of
@@ -254,7 +258,7 @@ module Cronofy
254
258
  # The first page will be retrieved eagerly so that common errors will happen
255
259
  # inline. However, subsequent pages (if any) will be requested lazily.
256
260
  #
257
- # See http://www.cronofy.com/developers/api/alpha#free-busy for reference.
261
+ # See http://www.cronofy.com/developers/api/#free-busy for reference.
258
262
  #
259
263
  # Returns a lazily-evaluated Enumerable of FreeBusy
260
264
  #
@@ -394,6 +398,26 @@ module Cronofy
394
398
  parse_json(Channel, "channel", response)
395
399
  end
396
400
 
401
+ # Public: Verifies a HMAC from a push notification using the client secret.
402
+ #
403
+ # args - A Hash containing the details of the push notification:
404
+ # :body - A String of the body of the notification.
405
+ # :hmac - A String of the HMAC of the notification taken from the
406
+ # Cronofy-HMAC-SHA256 header.
407
+ #
408
+ # Returns true if the HMAC provided matches the one calculated using the
409
+ # client secret, otherwise false.
410
+ def hmac_match?(args)
411
+ body = args[:body]
412
+ hmac = args[:hmac]
413
+
414
+ sha256 = OpenSSL::Digest.new('sha256')
415
+ digest = OpenSSL::HMAC.digest(sha256, @client_secret, body)
416
+ calculated = Base64.encode64(digest).strip
417
+
418
+ calculated == hmac
419
+ end
420
+
397
421
  # Public: Lists all the notification channels for the account.
398
422
  #
399
423
  # See http://www.cronofy.com/developers/api#list-channels for reference.
@@ -453,7 +477,7 @@ module Cronofy
453
477
 
454
478
  # Public: Lists all the profiles for the account.
455
479
  #
456
- # See https://www.cronofy.com/developers/api/alpha/#profiles for reference.
480
+ # See https://www.cronofy.com/developers/api/#profiles for reference.
457
481
  #
458
482
  # Returns an Array of Profiles
459
483
  #
@@ -1,3 +1,3 @@
1
1
  module Cronofy
2
- VERSION = "0.22.0".freeze
2
+ VERSION = "0.23.0".freeze
3
3
  end
@@ -136,12 +136,10 @@ describe Cronofy::Client do
136
136
  describe '#create_calendar' do
137
137
  let(:request_url) { 'https://api.cronofy.com/v1/calendars' }
138
138
  let(:method) { :post }
139
- let(:request_body) do
140
- {
141
- :profile_id => "pro_1234",
142
- :name => "Home",
143
- }
144
- end
139
+
140
+ let(:profile_id) { "pro_1234" }
141
+ let(:calendar_name) { "Home" }
142
+ let(:color) { "#49BED8" }
145
143
 
146
144
  let(:correct_response_code) { 200 }
147
145
  let(:correct_response_body) do
@@ -161,10 +159,34 @@ describe Cronofy::Client do
161
159
  Cronofy::Calendar.new(correct_response_body["calendar"])
162
160
  end
163
161
 
164
- subject { client.create_calendar("pro_1234", "Home") }
162
+ context "with mandatory arguments" do
163
+ let(:request_body) do
164
+ {
165
+ profile_id: profile_id,
166
+ name: calendar_name,
167
+ }
168
+ end
165
169
 
166
- it_behaves_like 'a Cronofy request'
167
- it_behaves_like 'a Cronofy request with mapped return value'
170
+ subject { client.create_calendar(profile_id, calendar_name) }
171
+
172
+ it_behaves_like 'a Cronofy request'
173
+ it_behaves_like 'a Cronofy request with mapped return value'
174
+ end
175
+
176
+ context "with color" do
177
+ let(:request_body) do
178
+ {
179
+ profile_id: profile_id,
180
+ name: calendar_name,
181
+ color: color,
182
+ }
183
+ end
184
+
185
+ subject { client.create_calendar(profile_id, calendar_name, color: color) }
186
+
187
+ it_behaves_like 'a Cronofy request'
188
+ it_behaves_like 'a Cronofy request with mapped return value'
189
+ end
168
190
  end
169
191
 
170
192
  describe '#list_calendars' do
@@ -1688,4 +1710,24 @@ describe Cronofy::Client do
1688
1710
  end
1689
1711
  end
1690
1712
  end
1713
+
1714
+ describe "HMAC verification" do
1715
+ let(:client) do
1716
+ Cronofy::Client.new(
1717
+ client_secret: 'pDY0Oi7TJSP2hfNmZNkm5',
1718
+ access_token: token,
1719
+ refresh_token: 'refresh_token_456',
1720
+ )
1721
+ end
1722
+
1723
+ let(:body) { "{\"example\":\"well-known\"}" }
1724
+
1725
+ it "verifies the correct HMAC" do
1726
+ expect(client.hmac_match?(body: body, hmac: "6r2/HjBkqymGegX0wOfifieeUXbbHwtV/LohHS+jv6c=")).to be true
1727
+ end
1728
+
1729
+ it "rejects an incorrect HMAC" do
1730
+ expect(client.hmac_match?(body: body, hmac: "something-else")).to be false
1731
+ end
1732
+ end
1691
1733
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cronofy
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.22.0
4
+ version: 0.23.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sergii Paryzhskyi
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2017-06-09 00:00:00.000000000 Z
12
+ date: 2017-07-21 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: oauth2
@@ -149,7 +149,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
149
149
  version: '0'
150
150
  requirements: []
151
151
  rubyforge_project:
152
- rubygems_version: 2.6.12
152
+ rubygems_version: 2.6.6
153
153
  signing_key:
154
154
  specification_version: 4
155
155
  summary: Cronofy - one API for all the calendars