File tree Expand file tree Collapse file tree 4 files changed +44
-1
lines changed Expand file tree Collapse file tree 4 files changed +44
-1
lines changed Original file line number Diff line number Diff line change @@ -174,6 +174,15 @@ def authenticate(socket_id, custom_data = nil)
174
174
r
175
175
end
176
176
177
+ def shared_secret ( encryption_master_key )
178
+ return unless encryption_master_key
179
+
180
+ secret_string = @name + encryption_master_key
181
+ digest = OpenSSL ::Digest ::SHA256 . new
182
+ digest << secret_string
183
+ Base64 . strict_encode64 ( digest . digest )
184
+ end
185
+
177
186
private
178
187
179
188
def validate_socket_id ( socket_id )
Original file line number Diff line number Diff line change @@ -375,7 +375,11 @@ def notify(interests, data = {})
375
375
#
376
376
def authenticate ( channel_name , socket_id , custom_data = nil )
377
377
channel_instance = channel ( channel_name )
378
- channel_instance . authenticate ( socket_id , custom_data )
378
+ r = channel_instance . authenticate ( socket_id , custom_data )
379
+ if channel_name . match ( /^private-encrypted-/ )
380
+ r [ :shared_secret ] = channel_instance . shared_secret ( encryption_master_key )
381
+ end
382
+ r
379
383
end
380
384
381
385
# @private Construct a net/http http client
Original file line number Diff line number Diff line change @@ -167,4 +167,21 @@ def authentication_string(*data)
167
167
} . to raise_error Pusher ::Error
168
168
end
169
169
end
170
+
171
+ describe `#shared_secret` do
172
+ before ( :each ) do
173
+ @channel . instance_variable_set ( :@name , 'private-encrypted-1' )
174
+ end
175
+
176
+ it 'should return a shared_secret based on the channel name and encryption master key' do
177
+ key = '3W1pfB/Etr+ZIlfMWwZP3gz8jEeCt4s2pe6Vpr+2c3M='
178
+ shared_secret = @channel . shared_secret ( key )
179
+ expect ( shared_secret ) . to eq ( "6zeEp/chneRPS1cbK/hGeG860UhHomxSN6hTgzwT20I=" )
180
+ end
181
+
182
+ it 'should return nil if missing encryption master key' do
183
+ shared_secret = @channel . shared_secret ( nil )
184
+ expect ( shared_secret ) . to be_nil
185
+ end
186
+ end
170
187
end
Original file line number Diff line number Diff line change 276
276
} )
277
277
end
278
278
279
+ it 'should include a shared_secret if the private-encrypted channel' do
280
+ allow ( MultiJson ) . to receive ( :encode ) . with ( @custom_data ) . and_return 'a json string'
281
+ @client . instance_variable_set ( :@encryption_master_key , '3W1pfB/Etr+ZIlfMWwZP3gz8jEeCt4s2pe6Vpr+2c3M=' )
282
+
283
+ response = @client . authenticate ( 'private-encrypted-test_channel' , '1.1' , @custom_data )
284
+
285
+ expect ( response ) . to eq ( {
286
+ :auth => "12345678900000001:#{ hmac ( @client . secret , "1.1:private-encrypted-test_channel:a json string" ) } " ,
287
+ :shared_secret => "o0L3QnIovCeRC8KTD8KBRlmi31dGzHVS2M93uryqDdw=" ,
288
+ :channel_data => 'a json string'
289
+ } )
290
+ end
291
+
279
292
end
280
293
281
294
describe '#trigger' do
You can’t perform that action at this time.
0 commit comments