Skip to content

Commit

Permalink
resolved conflicts
Browse files Browse the repository at this point in the history
  • Loading branch information
nixonsam committed May 28, 2020
2 parents 62c844a + fcd2612 commit dd4f386
Show file tree
Hide file tree
Showing 6 changed files with 220 additions and 16 deletions.
10 changes: 9 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,16 @@
# Change Log

## [4.5.0](https://github.com/plivo/plivo-go/tree/v4.5.0) (2020-05-04)
## [4.7.0](https://github.com/plivo/plivo-go/tree/v4.7.0) (2020-05-28)
- Add JWT helper functions.

## [4.6.0](https://github.com/plivo/plivo-go/tree/v4.6.0) (2020-04-29)
- Add V3 signature helper functions.

## [4.5.0](https://github.com/plivo/plivo-go/tree/v4.5.0) (2020-04-24)
- Add city and mms filter support for Number Search API
- Add city, country and mms into List Number and Number Search API's Response
- Fix for TotalCount in Number API's Response

## [4.4.0](https://github.com/plivo/plivo-go/tree/v4.4.0) (2020-03-31)
- Add application cascade delete support.

Expand Down
2 changes: 1 addition & 1 deletion baseclient.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ import (
"github.com/google/go-querystring/query"
)

const sdkVersion = "4.5.0"
const sdkVersion = "4.7.0"

type ClientOptions struct {
HttpClient *http.Client
Expand Down
7 changes: 3 additions & 4 deletions common.go
Original file line number Diff line number Diff line change
@@ -1,10 +1,9 @@
package plivo

type Meta struct {
Previous *string
Next *string

TotalCount int64
Previous *string
Next *string
TotalCount int64 `json:"total_count"`
Offset int64
Limit int64
}
Expand Down
13 changes: 10 additions & 3 deletions numbers.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,11 @@ type Number struct {
Alias string `json:"alias,omitempty" url:"alias,omitempty"`
VoiceEnabled bool `json:"voice_enabled,omitempty" url:"voice_enabled,omitempty"`
SMSEnabled bool `json:"sms_enabled,omitempty" url:"sms_enabled,omitempty"`
MMSEnabled bool `json:"mms_enabled,omitempty" url:"mms_enabled,omitempty"`
Description string `json:"description,omitempty" url:"description,omitempty"`
PlivoNumber bool `json:"plivo_number,omitempty" url:"plivo_number,omitempty"`
City string `json:"city,omitempty" url:"city,omitempty"`
Country string `json:"country,omitempty" url:"country,omitempty"`
Carrier string `json:"carrier,omitempty" url:"carrier,omitempty"`
Number string `json:"number,omitempty" url:"number,omitempty"`
NumberType string `json:"number_type,omitempty" url:"number_type,omitempty"`
Expand All @@ -19,6 +22,7 @@ type Number struct {
ResourceURI string `json:"resource_uri,omitempty" url:"resource_uri,omitempty"`
VoiceRate string `json:"voice_rate,omitempty" url:"voice_rate,omitempty"`
SMSRate string `json:"sms_rate,omitempty" url:"sms_rate,omitempty"`
MMSRate string `json:"mms_rate,omitempty" url:"mms_rate,omitempty"`
}

type NumberCreateParams struct {
Expand All @@ -45,9 +49,8 @@ type NumberListParams struct {
Subaccount string `json:"subaccount,omitempty" url:"subaccount,omitempty"`
Services string `json:"services,omitempty" url:"services,omitempty"`
Alias string `json:"alias,omitempty" url:"alias,omitempty"`

Limit int64 `json:"limit:omitempty" url:"limit:omitempty"`
Offset int64 `json:"offset:omitempty" url:"offset:omitempty"`
Limit int64 `json:"limit,omitempty" url:"limit,omitempty"`
Offset int64 `json:"offset,omitempty" url:"offset,omitempty"`
}

type NumberListResponse struct {
Expand Down Expand Up @@ -107,6 +110,7 @@ func (service *NumberService) Delete(NumberId string) (err error) {

type PhoneNumber struct {
Country string `json:"country" url:"country"`
City string `json:"city" url:"city"`
Lata int `json:"lata" url:"lata"`
MonthlyRentalRate string `json:"monthly_rental_rate" url:"monthly_rental_rate"`
Number string `json:"number" url:"number"`
Expand All @@ -120,6 +124,8 @@ type PhoneNumber struct {
SetupRate string `json:"setup_rate" url:"setup_rate"`
SmsEnabled bool `json:"sms_enabled" url:"sms_enabled"`
SmsRate string `json:"sms_rate" url:"sms_rate"`
MmsEnabled bool `json:"mms_enabled" url:"mms_enabled"`
MmsRate string `json:"mms_rate" url:"mms_rate"`
VoiceEnabled bool `json:"voice_enabled" url:"voice_enabled"`
VoiceRate string `json:"voice_rate" url:"voice_rate"`
}
Expand All @@ -132,6 +138,7 @@ type PhoneNumberListParams struct {
Services string `json:"services,omitempty" url:"services,omitempty"`
LATA string `json:"lata,omitempty" url:"lata,omitempty"`
RateCenter string `json:"rate_center,omitempty" url:"rate_center,omitempty"`
City string `json:"city,omitempty" url:"city,omitempty"`
Limit int `json:"limit,omitempty" url:"limit,omitempty"`
Offset int `json:"offset,omitempty" url:"offset,omitempty"`
}
Expand Down
92 changes: 92 additions & 0 deletions utils.go
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,98 @@ func ValidateSignatureV2(uri string, nonce string, signature string, authToken s
return ComputeSignatureV2(authToken, uri, nonce) == signature
}

func GenerateUrl(uri string, params map[string]string, method string) string {
parsedUrl, err := url.Parse(uri)
if err != nil {
panic(err)
}
uri = parsedUrl.Scheme + "://" + parsedUrl.Host + parsedUrl.Path
if len(params) > 0 || len(parsedUrl.RawQuery) > 0 {
uri += "?"
}
if len(parsedUrl.RawQuery) > 0 {
if method == "GET" {
queryParamMap := getMapFromQueryString(parsedUrl.Query())
for k, v := range params {
queryParamMap[k] = v
}
uri += GetSortedQueryParamString(queryParamMap, true)
} else {
uri += GetSortedQueryParamString(getMapFromQueryString(parsedUrl.Query()), true) + "." + GetSortedQueryParamString(params, false)
uri = strings.TrimRight(uri, ".")
}
} else {
if method == "GET" {
uri += GetSortedQueryParamString(params, true)
} else {
uri += GetSortedQueryParamString(params, false)
}
}
return uri
}

func getMapFromQueryString(query url.Values) map[string]string {
/*
Example: input "a=b&c=d&z=x"
output (string): {"z":x", "c": "d", "a": "b"}
*/
mp := make(map[string]string, 0)
if len(query) == 0 {
return mp
}
for key, val := range query {
mp[key] = val[0]
}
return mp
}

func GetSortedQueryParamString(params map[string]string, queryParams bool) string {
url := ""
keys := make([]string, 0, len(params))
for key, _ := range params {
keys = append(keys, key)
}
sort.Strings(keys)
if queryParams {
for _, key := range keys {
url += key + "=" + params[key] + "&"
}
url = strings.TrimRight(url, "&")
} else {
for _, key := range keys {
url += key + params[key]
}
}
return url
}

func ComputeSignatureV3(authToken, uri, method string, nonce string, params map[string]string) string {
var newUrl = GenerateUrl(uri, params, method) + "." + nonce
mac := hmac.New(sha256.New, []byte(authToken))
mac.Write([]byte(newUrl))
var messageMAC = base64.StdEncoding.EncodeToString(mac.Sum(nil))
logrus.Info(messageMAC)
return messageMAC
}

func ValidateSignatureV3(uri, nonce, method, signature, authToken string, params ...map[string]string) bool {
parameters := map[string]string{}
if len(params) != 0 {
parameters = params[0]
}
multipleSignatures := strings.Split(signature, ",")
return Find(ComputeSignatureV3(authToken, uri, method, nonce, parameters), multipleSignatures)
}

func Find(val string, slice []string) bool {
for _, item := range slice {
if item == val {
return true
}
}
return false
}

func checkAndFetchCallInsightsRequestDetails(param interface{}) (isCallInsightsRequest bool, requestPath string) {
isCallInsightsRequest = false
if reflect.TypeOf(param).Kind() == reflect.Map {
Expand Down
112 changes: 105 additions & 7 deletions utils_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -66,13 +66,111 @@ func TestValidateSignatureV2Pass(t *testing.T) {
),
)
}
func TestValidateSignatureV2Fail(t *testing.T) {
assert.Equal(t, false,
ValidateSignatureV2(
"https://answer.url",
"12345",
"ehV3IKhLysWBxC1sy8INm0qGoQYdYsHwuoKjsX7FsXc=",
"my_auth_tokens",

func TestValidateSignatureV3Pass1(t *testing.T) {
assert.Equal(t, true,
ValidateSignatureV3(
"https://plivobin.non-prod.plivops.com/api/v1/validate_signature03.xml/?a=b&c=d",
"31627761595286130198",
"POST",
"k7Pusd4OxCIjR5IfA9iedDNu/h/gbdYqdzG/MiYtd1c=",
"Y2Q2ZDgxZmY5YWRiOTI5YmQ1Njg0MTAxZWIyOTc4",
map[string]string{
"Direction": "outbound",
"From": "19792014278",
"ALegUUID": "3e82ae9d-2c78-4d85-b1a4-6eae7dbafb36",
"CallStatus": "in-progress",
"BillRate": "0.002",
"ParentAuthID": "MANWVLYTK4ZWU1YTY4QA",
"To": "sip:PlivoSignature382029104058171078704104@phone-qa.voice.plivodev.com",
"ALegRequestUUID": "3e82ae9d-2c78-4d85-b1a4-6eae7dbafb36",
"CallUUID": "3e82ae9d-2c78-4d85-b1a4-6eae7dbafb36",
"RequestUUID": "3e82ae9d-2c78-4d85-b1a4-6eae7dbafb36",
"SIP-H-To": "<sip:[email protected];transport=udp>;tag=1",
"SessionStart": "2020-04-08 11:34:33.238707",
"Event": "StartApp",
},
),
)
}

func TestValidateSignatureV3Pass2(t *testing.T) {
assert.Equal(t, true,
ValidateSignatureV3(
"https://plivobin.non-prod.plivops.com/api/v1/validate_signature03.xml/?a=b&c=d",
"31627761595286130198",
"GET",
"UBq8jAtd32wR8EK9VgxbBn4n5rpI/l1H9iN4WfSEHFQ=",
"Y2Q2ZDgxZmY5YWRiOTI5YmQ1Njg0MTAxZWIyOTc4",
map[string]string{
"Direction": "outbound",
"From": "19792014278",
"ALegUUID": "3e82ae9d-2c78-4d85-b1a4-6eae7dbafb36",
"CallStatus": "in-progress",
"BillRate": "0.002",
"ParentAuthID": "MANWVLYTK4ZWU1YTY4QA",
"To": "sip:PlivoSignature382029104058171078704104@phone-qa.voice.plivodev.com",
"ALegRequestUUID": "3e82ae9d-2c78-4d85-b1a4-6eae7dbafb36",
"CallUUID": "3e82ae9d-2c78-4d85-b1a4-6eae7dbafb36",
"RequestUUID": "3e82ae9d-2c78-4d85-b1a4-6eae7dbafb36",
"SIP-H-To": "<sip:[email protected];transport=udp>;tag=1",
"SessionStart": "2020-04-08 11:34:33.238707",
"Event": "StartApp",
},
),
)
}

func TestValidateSignatureV3Pass3(t *testing.T) {
assert.Equal(t, true,
ValidateSignatureV3(
"https://plivobin.non-prod.plivops.com/api/v1/validate_signature03.xml",
"31627761595286130198",
"POST",
"iAjE5QqI37mbkYe4w3jTMudqEzbDufdqi7sYwTu64e0=",
"Y2Q2ZDgxZmY5YWRiOTI5YmQ1Njg0MTAxZWIyOTc4",
map[string]string{
"Direction": "outbound",
"From": "19792014278",
"ALegUUID": "3e82ae9d-2c78-4d85-b1a4-6eae7dbafb36",
"CallStatus": "in-progress",
"BillRate": "0.002",
"ParentAuthID": "MANWVLYTK4ZWU1YTY4QA",
"To": "sip:PlivoSignature382029104058171078704104@phone-qa.voice.plivodev.com",
"ALegRequestUUID": "3e82ae9d-2c78-4d85-b1a4-6eae7dbafb36",
"CallUUID": "3e82ae9d-2c78-4d85-b1a4-6eae7dbafb36",
"RequestUUID": "3e82ae9d-2c78-4d85-b1a4-6eae7dbafb36",
"SIP-H-To": "<sip:[email protected];transport=udp>;tag=1",
"SessionStart": "2020-04-08 11:34:33.238707",
"Event": "StartApp",
},
),
)
}

func TestValidateSignatureV3Pass4(t *testing.T) {
assert.Equal(t, true,
ValidateSignatureV3(
"https://plivobin.non-prod.plivops.com/api/v1/validate_signature03.xml",
"31627761595286130198",
"GET",
"i/MQsaQSAd6fiKhOh2qeeeLHZ9faldADSb3/7+Akfbc=",
"Y2Q2ZDgxZmY5YWRiOTI5YmQ1Njg0MTAxZWIyOTc4",
map[string]string{
"Direction": "outbound",
"From": "19792014278",
"ALegUUID": "3e82ae9d-2c78-4d85-b1a4-6eae7dbafb36",
"CallStatus": "in-progress",
"BillRate": "0.002",
"ParentAuthID": "MANWVLYTK4ZWU1YTY4QA",
"To": "sip:PlivoSignature382029104058171078704104@phone-qa.voice.plivodev.com",
"ALegRequestUUID": "3e82ae9d-2c78-4d85-b1a4-6eae7dbafb36",
"CallUUID": "3e82ae9d-2c78-4d85-b1a4-6eae7dbafb36",
"RequestUUID": "3e82ae9d-2c78-4d85-b1a4-6eae7dbafb36",
"SIP-H-To": "<sip:[email protected];transport=udp>;tag=1",
"SessionStart": "2020-04-08 11:34:33.238707",
"Event": "StartApp",
},
),
)
}

0 comments on commit dd4f386

Please sign in to comment.