Skip to content

Commit 02a9216

Browse files
authored
Merge pull request #68 from farhatahmad/sha512
Added SHA512 support
2 parents 425bab2 + cbcb190 commit 02a9216

2 files changed

Lines changed: 58 additions & 24 deletions

File tree

lib/bigbluebutton_api.rb

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -67,15 +67,15 @@ class BigBlueButtonApi
6767
# secret:: Shared secret for this server
6868
# version:: API version e.g. 0.81
6969
# logger:: Logger object to log actions (so apps can use their own loggers)
70-
# sha256:: Flag to use sha256 when hashing url contents for checksum
71-
def initialize(url, secret, version=nil, logger=nil, sha256=false)
70+
# algorithm:: Define which algorithm to use [sha1, sha256, sha512]
71+
def initialize(url, secret, version=nil, logger=nil, algorithm="sha1")
7272
@supported_versions = ['0.8', '0.81', '0.9', '1.0']
7373
@url = url.chomp('/')
7474
@secret = secret
7575
@timeout = 10 # default timeout for api requests
7676
@request_headers = {} # http headers sent in all requests
7777
@logger = logger
78-
@sha256 = sha256
78+
@algorithm = algorithm
7979
# If logger is not informed, it defaults to STDOUT with INFO level
8080
if logger.nil?
8181
@logger = Logger.new(STDOUT)
@@ -604,7 +604,7 @@ def get_url(method, params={})
604604
# checksum calc
605605
checksum_param = params_string + @secret
606606
checksum_param = method.to_s + checksum_param
607-
checksum = @sha256 ? Digest::SHA256.hexdigest(checksum_param) : Digest::SHA1.hexdigest(checksum_param)
607+
checksum = calculate_checksum(checksum_param)
608608

609609
url = "#{@url}/#{method}?"
610610
url += "#{params_string}&" unless params_string.empty?
@@ -721,5 +721,15 @@ def nearest_version(target)
721721
end
722722
end
723723

724+
def calculate_checksum(checksum_param)
725+
case @algorithm
726+
when "sha512"
727+
Digest::SHA512.hexdigest(checksum_param)
728+
when "sha2", "sha256", true # checks true for legacy support
729+
Digest::SHA256.hexdigest(checksum_param)
730+
else
731+
Digest::SHA1.hexdigest(checksum_param)
732+
end
733+
end
724734
end
725735
end

spec/bigbluebutton_api_spec.rb

Lines changed: 44 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -465,31 +465,55 @@
465465
end
466466

467467
context "includes the checksum" do
468-
context "when @sha256 is false or nil" do
469-
let(:params) { { param1: "value1", param2: "value2" } }
470-
let(:checksum) {
471-
# the hash can be sorted differently depending on the ruby version
472-
if params.map{ |k, v| k }.join =~ /^param1/
473-
"67882ae54f49600f56f358c10d24697ef7d8c6b2"
474-
else
475-
"85a54e28e4ec18bfdcb214a73f74d35b09a84176"
476-
end
477-
}
468+
let(:method) { "join" }
469+
let(:params) { { param1: "value1", param2: "value2" } }
470+
let(:params_string) { params.map{ |k,v| "#{k}=" + URI.encode_www_form_component(v.to_s) unless k.nil? || v.nil? }.join("&") }
471+
let(:checksum_param) { method.to_s + params_string + secret }
472+
473+
context "when @algorithm is false or nil" do
474+
let(:checksum) { Digest::SHA1.hexdigest(checksum_param ) }
475+
476+
subject { api.get_url(:join, params)[0] }
477+
it('uses SHA1') { subject.should match(/checksum=#{checksum}$/) }
478+
end
479+
480+
context "when @algorithm is is set to 'sha1'" do
481+
let(:api) { BigBlueButton::BigBlueButtonApi.new(url, secret, version, logger, "sha1") }
482+
let(:checksum) { Digest::SHA1.hexdigest(checksum_param ) }
483+
478484
subject { api.get_url(:join, params)[0] }
479485
it('uses SHA1') { subject.should match(/checksum=#{checksum}$/) }
480486
end
481487

482-
context "when @sha256 flag is true" do
488+
context "when @algorithm flag is set to 'sha2'" do
489+
let(:api) { BigBlueButton::BigBlueButtonApi.new(url, secret, version, logger, "sha2") }
490+
let(:checksum) { Digest::SHA256.hexdigest(checksum_param ) }
491+
492+
subject { api.get_url(:join, params)[0] }
493+
it('uses SHA256') { subject.should match(/checksum=#{checksum}$/) }
494+
end
495+
496+
context "when @algorithm flag is set to 'sha256'" do
497+
let(:api) { BigBlueButton::BigBlueButtonApi.new(url, secret, version, logger, "sha256") }
498+
let(:checksum) { Digest::SHA256.hexdigest(checksum_param ) }
499+
500+
subject { api.get_url(:join, params)[0] }
501+
it('uses SHA256') { subject.should match(/checksum=#{checksum}$/) }
502+
end
503+
504+
context "when @algorithm flag is set to 'sha512'" do
505+
let(:api) { BigBlueButton::BigBlueButtonApi.new(url, secret, version, logger, "sha512") }
506+
let(:checksum) { Digest::SHA512.hexdigest(checksum_param ) }
507+
508+
subject { api.get_url(:join, params)[0] }
509+
it('uses SHA256') { subject.should match(/checksum=#{checksum}$/) }
510+
end
511+
512+
# Ensure legacy support
513+
context "when @algorithm flag is true" do
483514
let(:api) { BigBlueButton::BigBlueButtonApi.new(url, secret, version, logger, true) }
484-
let(:params) { { param1: "value1", param2: "value2" } }
485-
let(:checksum) {
486-
# the hash can be sorted differently depending on the ruby version
487-
if params.map{ |k,v| k }.join =~ /^param1/
488-
"0e7b1611809fad890a114dddae1a37fecf14c28971afc10ee3eac432da5b8b41"
489-
else
490-
"21bf2d24c27251c4b2b2f0d5dd4b966a2f16fbfc7882e102b44c6d67f728f0c8"
491-
end
492-
}
515+
let(:checksum) { Digest::SHA256.hexdigest(checksum_param ) }
516+
493517
subject { api.get_url(:join, params)[0] }
494518
it('uses SHA256') { subject.should match(/checksum=#{checksum}$/) }
495519
end

0 commit comments

Comments
 (0)