Skip to content

Commit

Permalink
Add programmable voice grant
Browse files Browse the repository at this point in the history
  • Loading branch information
jingming committed Aug 8, 2016
1 parent 7009154 commit 42cf898
Show file tree
Hide file tree
Showing 5 changed files with 130 additions and 42 deletions.
44 changes: 44 additions & 0 deletions src/Twilio.Auth.Tests/AccessTokenTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -134,5 +134,49 @@ public void ShouldAddGrants()
Assert.IsNotNull(grants["rtc"]);
Assert.IsNotNull(grants["ip_messaging"]);
}

[Test]
public void ShouldCreateVoiceGrant()
{
var token = new AccessToken("AC456", "SK123", "foobar");
var delta = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
var timestamp = (int)Math.Floor(delta.TotalSeconds);

var pvg = new ProgrammableVoiceGrant();
pvg.OutgoingApplicationSid = "AP123";

var param = new Dictionary<string, string>();
param.Add("foo", "bar");
pvg.OutgoingApplicationParams = param;

token.AddGrant(pvg);

var encoded = token.ToJWT();
Assert.IsNotNull(encoded);
Assert.IsNotEmpty(encoded);

var decoded = JsonWebToken.Decode(encoded, "foobar");
Assert.IsNotEmpty(decoded);
var serializer = new JavaScriptSerializer();
var payload = (Dictionary<string, object>)serializer.DeserializeObject(decoded);
Assert.IsNotNull(payload);

Assert.AreEqual("SK123", payload["iss"]);
Assert.AreEqual("AC456", payload["sub"]);
var exp = Convert.ToInt64(payload["exp"]);
Assert.AreEqual(timestamp + 3600, exp);
var jti = (string)payload["jti"];
Assert.AreEqual("SK123-" + timestamp.ToString(), jti);

var grants = (Dictionary<string, object>)payload["grants"];
Assert.AreEqual(1, grants.Count);

var decodedPvg = (Dictionary<string, object>)grants["programmable_voice"];
var outgoing = (Dictionary<string, object>)decodedPvg["outgoing"];
Assert.AreEqual("AP123", outgoing["application_sid"]);

var decodedParams = (Dictionary<string, object>)outgoing["params"];
Assert.AreEqual("bar", decodedParams["foo"]);
}
}
}
1 change: 0 additions & 1 deletion src/Twilio.Auth/AccessToken.cs
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,6 @@ public string ToJWT(JwtHashAlgorithm algorithm=JwtHashAlgorithm.HS256)

foreach (IGrant grant in this.Grants)
{
Console.Write(grant.GetGrantKey());
grantPayload.Add(grant.GetGrantKey(), grant.GetPayload());
}

Expand Down
46 changes: 46 additions & 0 deletions src/Twilio.Auth/ProgrammableVoiceGrant.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Twilio.Auth
{
public class ProgrammableVoiceGrant : IGrant
{
public string OutgoingApplicationSid { get; set; }
public Dictionary<string, string> OutgoingApplicationParams { get; set; }
public string PushCredentialSid { get; set; }
public string EndpointId { get; set; }


public string GetGrantKey()
{
return "programmable_voice";
}

public object GetPayload()
{
var payload = new Dictionary<string, object>();
if (this.OutgoingApplicationSid != null) {
var outgoing = new Dictionary<string, object>();
outgoing.Add("application_sid", this.OutgoingApplicationSid);

if (this.OutgoingApplicationParams != null) {
outgoing.Add("params", this.OutgoingApplicationParams) ;
}

payload.Add("outgoing", outgoing);
}

if (this.PushCredentialSid != null) {
payload.Add("push_credential_sid", this.PushCredentialSid);
}

if (this.EndpointId != null) {
payload.Add("endpoint_id", this.EndpointId);
}

return payload;
}
}
}
6 changes: 2 additions & 4 deletions src/Twilio.Auth/Twilio.Auth.csproj
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
Expand Down Expand Up @@ -34,9 +34,6 @@
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup>
<StartupObject />
</PropertyGroup>
<ItemGroup>
<Reference Include="JWT">
<HintPath>..\packages\JWT.1.3.4\lib\3.5\JWT.dll</HintPath>
Expand All @@ -57,6 +54,7 @@
<Compile Include="IGrant.cs" />
<Compile Include="IpMessagingGrant.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="ProgrammableVoiceGrant.cs" />
</ItemGroup>
<ItemGroup>
<None Include="packages.config" />
Expand Down
75 changes: 38 additions & 37 deletions src/packages/repositories.config
Original file line number Diff line number Diff line change
@@ -1,38 +1,39 @@
<?xml version="1.0" encoding="utf-8"?>
<repositories>
<repository path="../Twilio.Api.Tests.Integration/packages.config" />
<repository path="../Twilio.Api/packages.config" />
<repository path="../Twilio.Client.Capability/packages.config" />
<repository path="../Twilio.IpMessaging.Tests/packages.config" />
<repository path="../Twilio.IpMessaging/packages.config" />
<repository path="../Twilio.Lookups.Tests/packages.config" />
<repository path="../Twilio.Lookups/packages.config" />
<repository path="../Twilio.Monitor.Tests/packages.config" />
<repository path="../Twilio.Monitor/packages.config" />
<repository path="../Twilio.Mvc/packages.config" />
<repository path="../Twilio.Pricing.Tests/packages.config" />
<repository path="../Twilio.Pricing/packages.config" />
<repository path="../Twilio.TaskRouter.Tests/packages.config" />
<repository path="../Twilio.TaskRouter/packages.config" />
<repository path="../Twilio.Trunking.Tests/packages.config" />
<repository path="../Twilio.Trunking/packages.config" />
<repository path="..\Twilio.Api.Net4\packages.config" />
<repository path="..\Twilio.Api.Silverlight\packages.config" />
<repository path="..\Twilio.Api.Tests.Integration\packages.config" />
<repository path="..\Twilio.Api.WindowsPhone\packages.config" />
<repository path="..\Twilio.Api\packages.config" />
<repository path="..\Twilio.Client.Capability\packages.config" />
<repository path="..\Twilio.Lookups.Tests\packages.config" />
<repository path="..\Twilio.Lookups\packages.config" />
<repository path="..\Twilio.Monitor.Tests\packages.config" />
<repository path="..\Twilio.Monitor\packages.config" />
<repository path="..\Twilio.Mvc\packages.config" />
<repository path="..\Twilio.Pricing.Tests\packages.config" />
<repository path="..\Twilio.Pricing\packages.config" />
<repository path="..\Twilio.TaskRouter.Tests\packages.config" />
<repository path="..\Twilio.TaskRouter\packages.config" />
<repository path="..\Twilio.Trunking.Tests\packages.config" />
<repository path="..\Twilio.Trunking\packages.config" />
<repository path="..\Twilio.Twiml.Tests\packages.config" />
<repository path="..\Twilio.WinRT\packages.config" />
<?xml version="1.0" encoding="utf-8"?>
<repositories>
<repository path="../Twilio.Api.Tests.Integration/packages.config" />
<repository path="../Twilio.Api/packages.config" />
<repository path="../Twilio.Auth/packages.config" />
<repository path="../Twilio.Client.Capability/packages.config" />
<repository path="../Twilio.IpMessaging.Tests/packages.config" />
<repository path="../Twilio.IpMessaging/packages.config" />
<repository path="../Twilio.Lookups.Tests/packages.config" />
<repository path="../Twilio.Lookups/packages.config" />
<repository path="../Twilio.Monitor.Tests/packages.config" />
<repository path="../Twilio.Monitor/packages.config" />
<repository path="../Twilio.Mvc/packages.config" />
<repository path="../Twilio.Pricing.Tests/packages.config" />
<repository path="../Twilio.Pricing/packages.config" />
<repository path="../Twilio.TaskRouter.Tests/packages.config" />
<repository path="../Twilio.TaskRouter/packages.config" />
<repository path="../Twilio.Trunking.Tests/packages.config" />
<repository path="../Twilio.Trunking/packages.config" />
<repository path="..\Twilio.Api.Net4\packages.config" />
<repository path="..\Twilio.Api.Silverlight\packages.config" />
<repository path="..\Twilio.Api.Tests.Integration\packages.config" />
<repository path="..\Twilio.Api.WindowsPhone\packages.config" />
<repository path="..\Twilio.Api\packages.config" />
<repository path="..\Twilio.Client.Capability\packages.config" />
<repository path="..\Twilio.Lookups.Tests\packages.config" />
<repository path="..\Twilio.Lookups\packages.config" />
<repository path="..\Twilio.Monitor.Tests\packages.config" />
<repository path="..\Twilio.Monitor\packages.config" />
<repository path="..\Twilio.Mvc\packages.config" />
<repository path="..\Twilio.Pricing.Tests\packages.config" />
<repository path="..\Twilio.Pricing\packages.config" />
<repository path="..\Twilio.TaskRouter.Tests\packages.config" />
<repository path="..\Twilio.TaskRouter\packages.config" />
<repository path="..\Twilio.Trunking.Tests\packages.config" />
<repository path="..\Twilio.Trunking\packages.config" />
<repository path="..\Twilio.Twiml.Tests\packages.config" />
<repository path="..\Twilio.WinRT\packages.config" />
</repositories>

0 comments on commit 42cf898

Please sign in to comment.