Module: Plivo::Utils
- Included in:
- Plivo, Base::Resource, Base::ResourceInterface, Resources, Token
- Defined in:
- lib/plivo/utils.rb
Overview
Utils module
Constant Summary collapse
- TYPE_WHITELIST =
[Integer]
Class Method Summary collapse
- .compute_signatureV3?(url, auth_token, nonce) ⇒ Boolean
- .expected_type?(param_name, expected_types, param_value) ⇒ Boolean
- .expected_value?(param_name, expected_values, param_value) ⇒ Boolean
- .generate_url?(uri, params, method) ⇒ Boolean
- .getMapFromQueryString?(query) ⇒ Boolean
- .GetSortedQueryParamString?(params, queryParams) ⇒ Boolean
- .raise_invalid_request(message = '') ⇒ Object
- .valid_account?(account_id, raise_directly = false) ⇒ Boolean
- .valid_mainaccount?(account_id, raise_directly = false) ⇒ Boolean
- .valid_param?(param_name, param_value, expected_types = nil, mandatory = false, expected_values = nil) ⇒ Boolean
- .valid_signature?(uri, nonce, signature, auth_token) ⇒ Boolean
- .valid_signatureV3?(uri, nonce, signature, auth_token, method, params = {}) ⇒ Boolean
- .valid_subaccount?(account_id, raise_directly = false) ⇒ Boolean
Class Method Details
.compute_signatureV3?(url, auth_token, nonce) ⇒ Boolean
171 172 173 174 175 |
# File 'lib/plivo/utils.rb', line 171 def compute_signatureV3?(url, auth_token, nonce) sha256_digest = OpenSSL::Digest.new('sha256') new_url = url + "." + nonce return Base64.encode64(OpenSSL::HMAC.digest(sha256_digest, auth_token, new_url)).strip() end |
.expected_type?(param_name, expected_types, param_value) ⇒ Boolean
70 71 72 73 74 75 76 77 78 79 80 81 82 83 |
# File 'lib/plivo/utils.rb', line 70 def expected_type?(param_name, expected_types, param_value) return true if expected_types.nil? param_value_class = param_value.class param_value_class = Integer if TYPE_WHITELIST.include? param_value_class if expected_types.is_a? Array return true if expected_types.include? param_value_class raise_invalid_request("#{param_name}: Expected one of #{expected_types}"\ " but received #{param_value.class} instead") else return true if expected_types == param_value_class raise_invalid_request("#{param_name}: Expected a #{expected_types}"\ " but received #{param_value.class} instead") end end |
.expected_value?(param_name, expected_values, param_value) ⇒ Boolean
85 86 87 88 89 90 91 92 93 94 95 96 |
# File 'lib/plivo/utils.rb', line 85 def expected_value?(param_name, expected_values, param_value) return true if expected_values.nil? if expected_values.is_a? Array return true if expected_values.include? param_value raise_invalid_request("#{param_name}: Expected one of #{expected_values}"\ " but received '#{param_value}' instead") else return true if expected_values == param_value raise_invalid_request("#{param_name}: Expected '#{expected_values}'"\ " but received '#{param_value}' instead") end end |
.generate_url?(uri, params, method) ⇒ Boolean
111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 |
# File 'lib/plivo/utils.rb', line 111 def generate_url?(uri, params, method) uri.sub!("+", "%20") parsed_uri = URI.parse(uri) uri = parsed_uri.scheme + "://" + parsed_uri.host + parsed_uri.path if params.to_s.length > 0 || parsed_uri.query.to_s.length > 0 uri += "?" end if parsed_uri.query.to_s.length > 0 parsed_uri_query = URI.decode(parsed_uri.query) if method == "GET" queryParamMap = getMapFromQueryString?(parsed_uri_query) params.keys.sort.each { |key| queryParamMap[key] = params[key] } uri += GetSortedQueryParamString?(queryParamMap, true) else uri += GetSortedQueryParamString?(getMapFromQueryString?(parsed_uri_query), true) + "." + GetSortedQueryParamString?(params, false) uri = uri.chomp(".") end else if method == "GET" uri += GetSortedQueryParamString?(params, true) else uri += GetSortedQueryParamString?(params, false) end end return uri end |
.getMapFromQueryString?(query) ⇒ Boolean
140 141 142 143 144 145 146 147 148 149 150 151 152 153 |
# File 'lib/plivo/utils.rb', line 140 def getMapFromQueryString?(query) mp = Hash.new if query.to_s.length == 0 return mp end keyValuePairs = query.split("&") keyValuePairs.each { |key| params = key.split("=", 2) if params.length == 2 mp[params[0]] = params[1] end } return mp end |
.GetSortedQueryParamString?(params, queryParams) ⇒ Boolean
155 156 157 158 159 160 161 162 163 164 165 166 167 168 |
# File 'lib/plivo/utils.rb', line 155 def GetSortedQueryParamString?(params, queryParams) url = "" if queryParams params.keys.sort.each { |key| url += key + "=" + params[key] + "&" } url = url.chomp("&") else params.keys.sort.each { |key| url += key.to_s + params[key].to_s } end return url end |
.raise_invalid_request(message = '') ⇒ Object
55 56 57 |
# File 'lib/plivo/utils.rb', line 55 def raise_invalid_request( = '') raise Exceptions::InvalidRequestError, end |
.valid_account?(account_id, raise_directly = false) ⇒ Boolean
13 14 15 |
# File 'lib/plivo/utils.rb', line 13 def valid_account?(account_id, raise_directly = false) valid_subaccount?(account_id, raise_directly) || valid_mainaccount?(account_id, raise_directly) end |
.valid_mainaccount?(account_id, raise_directly = false) ⇒ Boolean
37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
# File 'lib/plivo/utils.rb', line 37 def valid_mainaccount?(account_id, raise_directly = false) unless account_id.is_a? String return false unless raise_directly raise_invalid_request('account_id must be a string') end if account_id.length != 20 return false unless raise_directly raise_invalid_request('account_id should be of length 20') end if account_id[0..1] != 'MA' return false unless raise_directly raise_invalid_request("account_id should start with 'SA'") end true end |
.valid_param?(param_name, param_value, expected_types = nil, mandatory = false, expected_values = nil) ⇒ Boolean
59 60 61 62 63 64 65 66 67 68 |
# File 'lib/plivo/utils.rb', line 59 def valid_param?(param_name, param_value, expected_types = nil, mandatory = false, expected_values = nil) if mandatory && param_value.nil? raise_invalid_request("#{param_name} is a required parameter") end return true if param_value.nil? return expected_type?(param_name, expected_types, param_value) unless expected_values expected_value?(param_name, expected_values, param_value) end |
.valid_signature?(uri, nonce, signature, auth_token) ⇒ Boolean
102 103 104 105 106 107 108 109 |
# File 'lib/plivo/utils.rb', line 102 def valid_signature?(uri, nonce, signature, auth_token) parsed_uri = URI.parse(uri) uri_details = {host: parsed_uri.host, path: parsed_uri.path} uri_builder_module = parsed_uri.scheme == 'https' ? URI::HTTPS : URI::HTTP data_to_sign = uri_builder_module.build(uri_details).to_s + nonce sha256_digest = OpenSSL::Digest.new('sha256') Base64.encode64(OpenSSL::HMAC.digest(sha256_digest, auth_token, data_to_sign)).strip() == signature end |
.valid_signatureV3?(uri, nonce, signature, auth_token, method, params = {}) ⇒ Boolean
177 178 179 180 181 |
# File 'lib/plivo/utils.rb', line 177 def valid_signatureV3?(uri, nonce, signature, auth_token, method, params={}) new_url = generate_url?(uri, params, method) generated_signature = compute_signatureV3?(new_url, auth_token, nonce) return signature.split(",").include? generated_signature end |
.valid_subaccount?(account_id, raise_directly = false) ⇒ Boolean
19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
# File 'lib/plivo/utils.rb', line 19 def valid_subaccount?(account_id, raise_directly = false) unless account_id.is_a? String return false unless raise_directly raise_invalid_request('subaccount_id must be a string') end if account_id.length != 20 return false unless raise_directly raise_invalid_request('subaccount_id should be of length 20') end if account_id[0..1] != 'SA' return false unless raise_directly raise_invalid_request("subaccount_id should start with 'SA'") end true end |