Skip to content

Instantly share code, notes, and snippets.

@lart2150
Created July 18, 2022 13:55
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save lart2150/b05b8c8e638f75aa5d5f64ffc389c739 to your computer and use it in GitHub Desktop.
Save lart2150/b05b8c8e638f75aa5d5f64ffc389c739 to your computer and use it in GitHub Desktop.
using System;
using System.Net;
using System.Text;
using System.IO;
using System.Text.RegularExpressions;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
namespace DomainToken
{
class GetDomainToken
{
private String UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36";
CookieContainer cookieContainer = new CookieContainer();
public GetDomainToken()
{
}
private HttpWebRequest getReqest(string url)
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.CookieContainer = cookieContainer;
request.UserAgent = UserAgent;
return request;
}
private HttpWebRequest getPost(string url, string body)
{
ASCIIEncoding ascii = new ASCIIEncoding();
byte[] postBytes = ascii.GetBytes(body);
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url);
request.CookieContainer = cookieContainer;
request.UserAgent = UserAgent;
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
request.ContentLength = postBytes.Length;
// add post data to request
Stream postStream = request.GetRequestStream();
postStream.Write(postBytes, 0, postBytes.Length);
postStream.Flush();
postStream.Close();
return request;
}
private string getResponseBody(HttpWebResponse response)
{
Stream dataStream = response.GetResponseStream ();
StreamReader reader = new StreamReader(dataStream);
string responseString = reader.ReadToEnd();
reader.Close ();
dataStream.Close ();
return responseString;
}
public Cookie getDomainTokenCookie(string username, string password)
{
Console.WriteLine("tivo domaintoken getter in c#");
Uri loginUrl = new Uri("https://online.tivo.com/start/watch/JustForMeTVE?forceAuth=1");
HttpWebRequest request = getReqest(loginUrl.ToString());
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
// Console.WriteLine(response.StatusDescription);
string responseFromServer = getResponseBody(response);
// Console.WriteLine (responseFromServer);
response.Close ();
// Console.WriteLine();
Regex rx = new Regex("name=\\\"SAMLRequest\\\" value=\\\"([^\\\"]*)\\\"",RegexOptions.None);
MatchCollection matches = rx.Matches(responseFromServer);
String SAMLRequest = matches[0].Groups[1].Value;
// Console.WriteLine("SAMLRequest: " + SAMLRequest);
// Console.WriteLine();
rx = new Regex("name=\\\"RelayState\\\" value=\\\"([^\\\"]*)\\\"",RegexOptions.None);
matches = rx.Matches(responseFromServer);
String RelayState = matches[0].Groups[1].Value;
// Console.WriteLine("RelayState: " + SAMLRequest);
// Console.WriteLine();
rx = new Regex("method=\\\"POST\\\" action=\\\"([^\\\"]*)\\\"",RegexOptions.None);
matches = rx.Matches(responseFromServer);
String SamlPostUrl = matches[0].Groups[1].Value;
// Console.WriteLine("SamlPostUrl: " + SamlPostUrl);
String samlStartPost = "SAMLRequest=" + Uri.EscapeDataString(SAMLRequest) + "&RelayState=" + Uri.EscapeDataString(RelayState);
request = getPost(SamlPostUrl, samlStartPost);
response = (HttpWebResponse)request.GetResponse();
Uri redirectUrl = response.ResponseUri;
responseFromServer = getResponseBody(response);
// Console.WriteLine (responseFromServer);
response.Close ();
// Console.WriteLine();
rx = new Regex("auraConfig = ([^;]*);",RegexOptions.None);
matches = rx.Matches(responseFromServer);
String auraConfig = matches[0].Groups[1].Value;
// Console.WriteLine("auraConfig: " + auraConfig);
JObject auraConfigObject = JObject.Parse(auraConfig);
JToken context = auraConfigObject["context"];
JToken loaded = context["loaded"];
JToken auraContext = JObject.Parse("{\"mode\":\"PROD\",\"fwuid\":\"\",\"app\":\"siteforce:loginApp2\",\"loaded\":\"\",\"dn\":[],\"globals\":{},\"uad\":false}");
auraContext["fwuid"] = context["fwuid"];
auraContext["loaded"] = loaded;
JObject auth = JObject.Parse("{\"actions\":[{\"id\":\"87;a\",\"descriptor\":\"apex://Tivo_idp_LightningLoginFormController/ACTION$login\",\"callingDescriptor\":\"markup://c:tivo_idp_login_form\",\"params\": {\"username\":\"username\",\"password\":\"password\",\"startUrl\":\"[\\\"startURL=/idp/login?app=0sp380000004COf\\\"]\",\"relayState\":\"binding=HttpPost\"}}]}");
JToken authParams = auth["actions"][0]["params"];
authParams["username"] = username;
authParams["password"] = password;
// Console.WriteLine (auth.ToString());
String loginPostBody = "message=" + Uri.EscapeDataString(auth.ToString(Formatting.None))
+ "&aura.context=" + Uri.EscapeDataString(auraContext.ToString(Formatting.None))
+ "&aura.pageURI=" + Uri.EscapeDataString(redirectUrl.AbsoluteUri)
+ "&aura.token=undefined";
// Console.WriteLine("loginPostBody: " + loginPostBody);
request = getPost("https://tivoidp.tivo.com/s/sfsites/aura?r=4&other.Tivo_idp_LightningLoginForm.login=1", loginPostBody);
response = (HttpWebResponse)request.GetResponse();
responseFromServer = getResponseBody(response);
// Console.WriteLine("loginResponse: " + responseFromServer);
JObject loginResponse = JObject.Parse(responseFromServer);
String frontDoor = (string) loginResponse["events"][0]["attributes"]["values"]["url"];
// Console.WriteLine("frontDoor: " + frontDoor);
request = getReqest(frontDoor);
response = (HttpWebResponse)request.GetResponse();
responseFromServer = getResponseBody(response);
rx = new Regex("window\\.location\\.href=\\\"([^\\\"]*)\\\"",RegexOptions.None);
matches = rx.Matches(responseFromServer);
String frontDoorResponse = matches[0].Groups[1].Value;
// Console.WriteLine("frontDoorResponse: " + frontDoorResponse);
request = getReqest("https://tivoidp.tivo.com" + frontDoorResponse);
response = (HttpWebResponse)request.GetResponse();
responseFromServer = getResponseBody(response);
rx = new Regex("name=\\\"SAMLResponse\\\" value=\\\"([^\\\"]*)\\\"",RegexOptions.None);
matches = rx.Matches(responseFromServer);
String SAMLResponse = matches[0].Groups[1].Value;
rx = new Regex("action=\\\"([^\\\"]*)\\\"",RegexOptions.None);
matches = rx.Matches(responseFromServer);
String SAMLResponseAction = matches[0].Groups[1].Value;
// Console.WriteLine("SAMLResponse: " + SAMLResponse);
// Console.WriteLine("SAMLResponseAction: " + SAMLResponseAction);
// Console.WriteLine();
string SAMLResponseBody = "SAMLResponse=" + Uri.EscapeDataString(SAMLResponse);
// Console.WriteLine("SAMLResponseBody: " + SAMLResponseBody);
request = getPost(SAMLResponseAction, SAMLResponseBody);
response = (HttpWebResponse)request.GetResponse();
responseFromServer = getResponseBody(response);
// Console.WriteLine();
// Console.WriteLine("responseFromServer: " + responseFromServer);
// Console.WriteLine("ResponseUri: " + response.ResponseUri);
// Console.WriteLine();
CookieCollection cookieCollection = cookieContainer.GetCookies(loginUrl);
foreach(Cookie c in cookieCollection) {
if (c.Name == "domainToken") {
Console.WriteLine($"{c.Name} = {c.Value}");
Console.WriteLine($"Expires: {c.Expires} (expired? {c.Expired})");
return c;
}
}
return null;
}
static void Main(string[] args)
{
GetDomainToken gdt = new GetDomainToken();
Console.Write("Username: ");
string username = Console.ReadLine();
Console.Write("Password: ");
string password = Console.ReadLine();
gdt.getDomainTokenCookie(username, password);
}
}
}
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net48</TargetFramework>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Net.Compilers" Version="4.2.0">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
</PackageReference>
<PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
</ItemGroup>
</Project>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment