Created
July 18, 2022 13:55
-
-
Save lart2150/b05b8c8e638f75aa5d5f64ffc389c739 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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); | |
} | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<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